大家好,今天给大家聊聊iOS开发中多线程同步的话题。说到多线程同步,各位童鞋们可能马上就会想到NSLock、NSCondtion甚至OSSpinLock等各种线程锁。不过,今天我们不谈线程锁。如果你对Lock感兴趣,可以阅读这篇文章。既然不说线程锁,那你说呢?当然,多线程同步意味着线程同步不等于线程锁。要解决同步问题,首先需要了解为什么需要线程同步。线程同步的主要原因是多个线程可能同时操作一个对象,导致状态不一致。是不是可以这样理解,如果多个线程不同时访问对象,那么同步问题就解决了。我该怎么做呢?可以用串行队列的思想,什么是串行队列?可以简单理解为所有的操作都必须顺序进行。主线程是一个串行队列。最简单的同步方式就是将同步操作放在主线程上执行。不过,我没说既然不能在主线程执行,那放在子线程不就可以了吗?创建子线程的方法有很多种,这里不再赘述。有兴趣的童鞋可以大显身手。GCDsynchronizingGCD可能是创建子线程最简单的方法之一。关于GCD,这篇文章介绍的比较详细。进一步描述。既然要实现线程同步,首先需要创建一个串行队列_queue=dispatch_queue_create("com.olinone.synchronize.serialQueue",NULL);dispatch_queue_tdQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);dispatch_set_target_queue(_queue,dQueue);同步事件可以一个一个加入队列,保证多线程同步dispatch_async(_queue,^{block();});NSOperationQueue通过GCD同步可以满足大部分需求,但难免有一些特殊需求,比如操作Cancel。这时候,NSOperationQueue会是一个不错的选择。NSOperationQueue虽然是并发多线程池,但是其巧妙的设计也可以实现串行队列的功能。当maxConcurrentOperationCount=1时,同时只执行一个NSOperation,NSOperationQueue由并发执行变为串行执行。NSOperationQueue*operationQueue=[[NSOperationQueuealloc]init];operationQueue.maxConcurrentOperationCount=1;实现方法和GCD一样,顺序同步操作的串行执行可以通过在线程池中加入同步操作来实现-(void)execSyncBlock:(void(^)())block{if(NSOperationQueue.currentQueue==self){block();}else{NSBlockOperation*operation=[NSBlockOperationblockOperationWithBlock:block];[selfaddOperations:@[operation]waitUntilFinished:YES];}}HJSynchronizeDemo详细展示了实际的用法。巧妙地使用串行队列可以带来意想不到的结果。除了解决多线程同步,它还可以处理串行的大规模计算和其他服务,比如图像渲染、音频处理等。
