simple and reliable Threading with NSOperation

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

    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值