iOS正确使用多线程

时间:2013-06-13 08:33:10

标签: ios multithreading grand-central-dispatch nsoperation nsoperationqueue

我想知道如何在iOS中使用多线程。我知道GCD和NSOperationQueue,但我不确定如何正确使用它们。

  1. 我应该何时使用GCD / NSOperationQueue?
  2. 如果结果视图不再可见,如何取消队列? (即发送请求的东西,但用户然后决定点击后退按钮去另一个视图,这意味着我不再需要“某事”)
  3. 非常感谢任何例子。

    谢谢。

2 个答案:

答案 0 :(得分:1)

值得一提的是,一旦操作开始(GCD块或NSOperation),只有在操作本身内置了取消能力时才能取消它。例如,NSOperation有一个-cancel方法,但只有当您的操作定期从操作内部检查-isCanceled标志,然后如果它看到操作已被取消时才提前返回,则该方法有效。来自-[NSOperation cancel]的文档:

  

此方法不会强制您的操作代码停止。相反,它   更新对象的内部标志以反映状态的变化。如果   操作已经完成执行,此方法没有   影响。取消当前正在进行的操作   队列,但尚未执行,可以删除   比平常更快地从队列中进行操作。

同样,GCD块可以检查一些共享标志并提前返回,但这些机制都不能强制取消操作。这样做的原因是,如果你能够强制取消操作,它就没有机会自我清理,因此在任务期间分配的任何内存都将被泄露。

围绕此限制的另一种常见方法是将您的任务划分为更多更小的操作,以便单个操作完成的时间足够小,可以忽略不计。这使您能够在整个队列级别暂停/取消队列/ NSOperationQueue,并获得大致所需的效果。

答案 1 :(得分:0)

通过Apple Docs,您可以找到方法setSuspended:cancelAllOperations。这可以用来实现你的要求。