iOS开发之GCD(2)API Dispatch Queue

来源:互联网 发布:java语法大全 编辑:程序博客网 时间:2024/04/19 13:11

生成dispatch queue的API:

(1)生成Serial Dispatch Queue(一个线程,追加的任务按照追加顺序一次执行)

        dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.faterman.gcd_demo_mySerialDispatchQueue", NULL);

tips:1.这种方式可以避免数据竞争

   2.生成多个Serial Dispatch Queue并各自追加任务,也可以实现并发处理。但是要根据需要合理控制生成数量。


(2)生成Concurrent Dispatch Queue(由XNU内核启动合理数量的线程,并发执行追加的任务)

        dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.faterman.gcd_demo_mySerialDispatchQueue", DISPATCH_QUEUE_CONCURRENT);

Dispatch Queue的内存管理(ARC讨论):

(1)在6.0的SDK之前,虽然已经有了ARC技术,但是Dispatch Queue并没有像Block一样作为对象被纳入管理范畴。所以即使是ARC文件仍旧需要手动进行retain和release。

dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.faterman.gcd_demo_mySerialDispatchQueue", DISPATCH_QUEUE_CONCURRENT);                        dispatch_async(mySerialDispatchQueue, ^{           //执行长时间的处理            //图像识别            //数据库读取            dispatch_async(dispatch_get_main_queue(), ^{                //用户界面更新            });                                });                        dispatch_release(mySerialDispatchQueue);
tips:这样的操作没有问题,因为block会持有queue,所以可以在异步时候对queue进行release。block执行结束后会释放queue。


(2)在6.0的SDK之后


生成属性

#if OS_OBJECT_USE_OBJC@property (strong, nonatomic) dispatch_queue_t barrierQueue;#else@property (assign, nonatomic) dispatch_queue_t barrierQueue;#endif


override dealloc方法

#if !OS_OBJECT_USE_OBJC   //这个宏是在sdk6.0之后才有的,如果是之前的,则OS_OBJECT_USE_OBJC为0    dispatch_release(_barrierQueue);#endif当然了,也可以使用#if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000 // 6.0sdk之前    dispatch_release(_barrierQueue);#endif


ySerialDispatchQueue)


0 0