NSOperation KVO's it's properties isFinished and isExecuting. From documentation
Upon completion or cancellation of its task, your concurrent operation
object must generate KVO notifications for both the isExecuting and
isFinished key paths to mark the final change of state for your
operation. (In the case of cancellation, it is still important to
update the isFinished key path, even if the operation did not
completely finish its task. Queued operations must report that they
are finished before they can be removed from a queue.) In addition to
generating KVO notifications, your overrides of the isExecuting and
isFinished methods should also continue to return accurate values
based on the state of your operation.
Basically when you generate a notification isFinished = YES
and isExecuting = NO
, your NSOperation will be removed from the queue.