from: https://developer.apple.com/library/ios/technotes/tn2109/_index.html
线程能解决两个方面的问题
1 并行计算
2 异步计算
但是如果是这两个方面的事,就不好用线程了
1周期性执行的任务 //
2网路工作 //最好实用原生的networking APIs
通常可以通过NSThread API 或 Cocoa的 performSelectorInBackground:withObject:
的方法来实现多线程,
section1 来展示thread problems
额外线程不能直接操作main thraed的UIKit
1用户添加一个项目 然后再threadA中长时间执行计算
2当A还没有执行完的时候,用户移除的item 然后B开始长时间的计算
那就拷贝一份array就能解诀这个问题
还有问题,
1 用户添加了一组item给list。然后A开始了新一轮的运算,A会花费很长的时间进行运算(运算时间的长度和数组的length成正比)
2 用户只留下一item,然后移除了其他的所有item。B开始运算了,然后消耗的时间非常短。
3 B结束后展示的是新的结果
4 A然后会覆盖B的结果,展示的是旧的数据
还有两个更加严重的问题
1 取消 你取消A的同时,运行B。那么因为A的结果会是没有用的,所以我们最好取消A
2 存贮单元分配的 线程安全 view controller 的 -dealloc方法调用问题
section2 来展示NSOperation如何解决这些问题
NSOperation能够在thread ,asynchronously via run loop callbacks
NSOperation 使用thread confinement的编程模式,所有的资源被本线程所拥有,没有与其他线程分享。
使用NSOperation比较好的方法是:
1 用不变的data的copy来初始化operation
2 执行operation。执行的时候,只操作他初始化用的data和属于他的data,不与其他线程分享数据
3 operation结束的时候,其让数据对程序可用,同时自己不再接触这些数据。
Note:如果1不方便copy数据,那就只能你自己让这些数据只被它能够使用,不让其他thread operate它。3serial thread confinement
NSOperation有以下几个有用的资源:
1 每个operation都是通过operation queue(NSOperationQueue)来执行的.queue都有最大可并发执行的operation的数量(queue width)
2 通过operation queue来model problem space。
3 可以让operation 依赖其他 operation
section3 提供一下有效的tips和hints来提升效率
warning :在view controller中维持一个 operation queue是一很棘手的。但是在这个sample中,是没有关系的,因为ListAdderViewController是root view controller,它不会被deallocated.
NSOperation GCD 两者都相互补充
GCD是比较low-level API,可以给你更多灵活 NSOperation让你更加关注你的异步的代码
-------------------------------------------------------------------
Deallocation 问题
在UIKit object中,比如view controller中使用第二thread最大的问题是确保你的object deallocated safely.
以下情况会发生问题:
1
-performSelectorInBackground:withObject:
-performSelector:onThread:withObject:waitUnitDone:
-performSelector:onThread:withObject:waitUnitDone:modes:
2 当你用NSThread启动第二个thread
3 when you run a block asynchronously and block references self or an instance
当second thread 保留了一个target object,你要确保在main thread释放这个object的最后的引用之前 second thread就已经释放这个target的引用。如果你不能做到,那么target object的最后一个reference会被second thread所释放,就意味着,object的-dealloc方法会跑在second thread上。如果-dealloc方法在第二个线程上操作有危险的话,就会出现问题。比如view controller.
//example
//解决方法
1
2
NSOperation 支持两种operation
1 standard operations
需要NSOperation来为他们提供并发 NSOperationQueue要指定thread
exp: long-running computations I/O (disk I/0)
2 concurrent operations
这些operation有他们自己的并发 NSOperationQueue不需要指定thread
exp: NSURLConnection API to do HTTP request