NSOperation的使用细节 [1]
NSOperation的使用細節 [1]
?
NSOperation 使用起來并沒有GCD直觀,但它有著非常不錯的面向對象接口,還可以取消線程操作,這一點是GCD所沒有的,NSOperation本身是抽象類,不能夠拿它直接使用。
以下節選自?ConcurrencyProgrammingGuide
其中?NSBlockOperation 與?NSInvocationOperation 是直接繼承自?NSOperation 的子類,便于你進行簡單的線程操作(為了獲取更多的操作條件,我們需要通過繼承 NSOperation 來設計更復雜的操作)。?All operation objects support the following key features?
* Support for?the establishment of graph-based dependencies between operation objects. These dependencies prevent a given operation from running until all of the operations on which it depends have finished running. For information about how to configure dependencies, see Configuring Interoperation Dependencies (page 29).
* Support for?an optional completion block, which is executed after the operation’s main task finishes. (OS X v10.6 and later only.) For information about how to set a completion block, see Setting Up a Completion Block (page 31).
* Support for?monitoring changes to the execution state of your operations using KVO notifications. For information about how to observe KVO notifications, see Key-Value Observing Programming Guide .
* Support for?prioritizing operations and thereby affecting their relative execution order. For more information, see Changing an Operation’s Execution Priority (page 30).
* Support for?canceling semantics that allow you to halt an operation while it is executing. For information about how to cancel operations, see Canceling Operations (page 37). For information about how to support cancellation in your own operations, see Responding to Cancellation Events (page 23).?
?Concurrent Versus Non-concurrent Operations ?
Although you typically execute operations by adding them to an operation queue, doing so is not required. It is also possible to execute an operation object manually by calling its start method, but doing so does not guarantee that the operation runs concurrently with the rest of your code. The isConcurrent method of the?NSOperation class tells you whether an operation runs synchronously or asynchronously with respect to the thread in which its start method was called. By default, this method returns NO, which means the operation runs synchronously in the calling thread.
If you want to implement a concurrent operation—that is, one that runs asynchronously with respect to the calling thread—you must write additional code to start the operation asynchronously. For example, you might spawn a separate thread, call an asynchronous system function, or do anything else to ensure that the start method starts the task and returns immediately and, in all likelihood, before the task is finished.
Most developers should never need to implement concurrent operation objects. If you always add your operations to an operation queue, you do not need to implement concurrent operations.?When you submit a nonconcurrent operation to an operation queue, the queue itself creates a thread on which to run your operation. Thus, adding a nonconcurrent operation to an operation queue still results in the asynchronous execution of your operation object code.?The ability to define concurrent operations is only necessary in cases where you need to execute the operation asynchronously without adding it to an operation queue (如果要定義成concurrent操作,只有在這種情形下才可以:你需要異步調用需要的操作,但是又不會將其添加到操作隊列當中).
For information about how to create a concurrent operation, see Configuring Operations for Concurrent Execution (page 25) and NSOperation Class Reference .
總結
以上是生活随笔為你收集整理的NSOperation的使用细节 [1]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现一个div在浏览器水平居中
- 下一篇: 浅谈BFC和IFC