iOS 多线程

来源:互联网 发布:中国航信网络面试 编辑:程序博客网 时间:2024/06/09 19:29

为什么使用多线程:

网络请求 :异步请求,不占主线程

图片加载

文件处理

数据存储

任务执行



多线程原理:

单核操作系统:操作系统会为每个线程分配时间段,交替进行 宏观并行,微观串行

多核:并行

优缺点:

优:1、简化编程模型(设计复杂的系统设计中,单一线程处理大的,林散的任务困难,多线程就可以简化编程模型) 2、更加轻量级 3、提高执行效率4、提高资源利用率

缺:

1、增加程序的设计复杂度(资源共享、线程读写数据库操作一个线程在做写操作,另一个就不能进行写操作,要注意许多问题,增加程序设计复杂度)

2、占用内存空间

3、增加cpu调度开销

技术实现方案:

pThread   c源框架,iOS中用的少  pthread_create

NAThread 三种创建方式  ,有对象的可以设置属性

资源共享的问题:线程锁:1@sychronizedself){}2、[[NSCondition allocinitlock]执行完 unlock,换另外的线程操作


GCD:多核并行运算;自动管理线程生命周期

NSOperation:对gcd的封装,两种方式1NSInvocationOperation &NSBlockOperation

2、自定义类继承NSOperation


NSOperation NSOperationQueue

NSOperation是一个抽象类,我们可以用它来封装一系列操作的代码和数据。因为它是抽象,我们无法直接使它,而是使用它的子类。这个子类要么你自己定义,要么使用系统定义好的(NSInvocationOperation或者NSBlockOperation)。尽管它是抽象的,但是,NSOperation可以让我们只需要关心任务的实现过程,而不必关心它是如何确保与其他系统对象正确运转的。

NSOperation对象是"一次性"的,它一旦执行了它的任务之后,就不能被用来再次执行了。将NSOperation的对象添加到一个操作队列中(NSOperationQueue的一个实例)。这个队列会自动执行它所包含的操作,可能直接开辟一个线程执行,也可能间接地使用libdispatch库。

如果不想使用队列,可以调用NSOperation的实例方法start来执行操作。如果手动控制操作的执行,我们需要考虑更多的内容。因为如果执行一个没有处在ready状态的操作,系统会抛出异常。

Operation之间的依赖

依赖可以很好地控制操作的执行先后顺序。我们可以通过调用addDependency:removeDependency:来为一个操作添加或移除依赖。默认地,如果一个操作的依赖都没有执行完,那么它不会进入ready状态。一旦它的依赖执行完成,它就可以立即被执行。

一个操作不会判断它的依赖是否成功地执行。(取消一个操作近似于标记这个操作已经完成。)一个有依赖的操作在它的依赖被取消或者未执行成功的情况下是否被继续执行取决于我们自己。这需要我们给操作加入一些错误跟踪能力,以保证我们及时发现问题。

NSOperation的一些方法和属性

方法:

  • start。可以让NSOperation直接执行。
  • cancel。取消NSOperation的操作。
  • addDependency: removeDependency:。为NSOperation添加依赖或移除依赖。

属性:

  • queuePriority。在队列中的优先级。有NSOperationQueuePriorityVeryLowNSOperationQueuePriorityLowNSOperationQueuePriorityNormalNSOperationQueuePriorityHighNSOperationQueuePriorityVeryHigh5个值。如果没有明确设置,默认是NSOperationQueuePriorityNormal
  • qualityOfService。表示当前NSOperation的相对重要性,以获取不同程度的系统资源。

Operation的状态

NSOperation类还提供一系列属性表示操作目前的状态。

  • cancelled。表示是否被取消。默认值是NO。可以通过调用cancel方法取消操作的执行,这个属性的值被置为YES。一旦取消,操作就会进入finished状态。
  • executing。表示操作是否正在执行。
  • finished。表示操作是否执行完毕。
  • concurrentasynchronous。这两个属性都表示操作是否是异步的。
  • ready。表示当前的操作是否可以开始执行。

注意:上面的几个属性都是只读的。

当我们继承NSOperation,实现子类的时候,在main函数的开头要判断cancelled的值,以尽快退出一个已经取消的操作。同时,必须要重新实现executingfinishedasynchronousready这几个属性。

NSOperationQueue

NSOperationQueue管理队列中NSOperation的执行顺序。当一个NSOperation被添加到队列中后,除非它被取消或者执行完操作,否则会一直存在于队列中。存在于队列中NSOperation根据它们自身的优先级和依赖关系,确定执行的顺序。一个应用可以创建多个队列,NSOperation可以添加到任意一个队列中。

NSOperation的依赖决定NSOperation执行的绝对顺序,即使它们不在同一个队列中。当NSOperation的依赖没有完全执行结束时,它是不会进入ready状态。对于那些进入ready状态的NSOperation,队列会选择一个优先级相对最高的那个NSOperation来执行。

队列中的NSOperation不能直接被移除,直到它被标记成finished。即使NSOperation被标记为finished,也不意味着它被执行完成。因为它是可以被取消的。对于在队列中处于ready,还没被执行的NSOperation,会自动调用start方法将操作执行完毕。

NSOperationQueue总是开辟一个新的线程来执行队列里的NSOperationNSOperationQueue使用libdispatch库来初始化执行NSOperation的队列。因此,NSOperation总是在不同的线程里被执行,无论它是否被指定是同步或异步。

property(getter=isSuspended) BOOL suspended

这个属性可以使当前队列中的NSOperation延迟执行。默认值是NO。当被设为YES时,当前队列中还未执行的NSOperation就会延时执行,直到这个值重新被设为NO

好的链接:http://vinnyxiong.cn/blog/nsoperation-and-nsoperationqueue-3.html


http://www.cnblogs.com/wendingding/p/3806821.html