iOS多线程开发总结

  • 并发和并行的区别:假设每个核心有两个线程,那么每个CPU中两个线程会交替执行,两个CPU之间的操作会并行计算。单就一个CPU而言两个线程可以解决线程阻塞造成的不流畅问题,其本身运行效率并没有提高,多CPU的并行运算才真正解决了运行效率问题;
  • 无论使用哪种方法进行多线程开发,每个线程启动后并不一定立即执行相应的操作,具体什么时候由系统调度(CPU空闲时就会执行)。
  • 更新UI应该在主线程(UI线程)中进行,并且推荐使用同步调用,常用的方法如下:
  1. -(void)performSelectorOnMainThread:(SEL)aSelector
                                               withObject:(id)arg
                                          waitUntilDone:(BOOL)wait;
  2.  [NSOperationQueue mainQueue] addOperationWithBlock:
  3.  dispatch_sync(dispatch_get_main_queue(), ^{}) 
  • NSThread适合轻量级多线程开发,控制线程顺序比较难,同时线程总数无法控制(每次创建并不能重用之前的线程,只能创建一个新的线程)。
  • 对于简单的多线程开发建议使用NSObject的扩展方法完成,而不必使用NSThread。
  • 可以使用NSThread的currentThread方法取得当前线程,使用 sleepForTimeInterval:方法让当前线程休眠,使用threadPriority属性调整优化级。
  • NSOperation进行多线程开发可以控制线程总数及线程依赖关系。
  • 创建一个NSOperation不应该直接调用start方法(如果直接start则会在主线程中调用)而是应该放到NSOperationQueue中启动。
  • 相比NSInvocationOperation推荐使用NSBlockOperation,代码简单,同时由于闭包性使它没有传参问题。
  • NSOperation是对GCD面向对象的ObjC封装,但是相比GCD基于C语言开发,效率却更高,建议如果任务之间有依赖关系或者想要监听任务完成状态的情况下优先选择NSOperation否则使用GCD。
  • 在GCD中串行队列中的任务被安排到一个单一线程执行(不是主线程),可以方便地控制执行顺序;并发队列在多个线程中执行(前提是使用异步方法),顺序控制相对复杂,但是更高效。
  • 在GDC中一个操作是多线程执行还是单线程执行取决于当前队列类型和执行方法,只有队列类型为并行队列并且使用异步方法执行时才能在多个线程中执行(如果是并行队列使用同步方法调用则会在主线程中执行)。
  • 相比使用NSLock,@synchronized更加简单,推荐使用后者[1]

  1. 在开发过程中除非必须用锁,否则应该尽可能不使用锁,因为多线程开发本身就是为了提高程序执行顺序,而同步锁本身就只能一个进程执行,这样不免降低执行效率。 ↩

你可能感兴趣的:(iOS多线程开发总结)