用户下载一个大图片,分成很多份下载,如何使用GCD实现
使用Dispatch Group追加block到Global GroupQueue,这些block如果全部执行完毕,那么就会执行通过dispatch_group_notify添加到主队列中的block,进行图片的合并处理。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ /*加载图片1*/ }); dispatch_group_async(group, queue, ^{ /*加载图片2*/ }); dispatch_group_async(group, queue, ^{ /*加载图片3*/ }); dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // 合并图片...... });
项目中什么时候选择使用GCD?什么时候选择NSOperation
NSOperation是对线程的高度抽象,提供Objective-C语言接口,具备面向对象特性(复用、封装),可子类化NSOperation进行操作对象的复用,使程序逻辑结构更清晰。比起GCD,NSOperation可以直接设置操作之间的依赖关系实现线程同步,而且可以通过调用cancel方法中途取消操作,而在GCD中不可取消。NSOperation的线程逻辑控制更加精细灵活,同时复杂度较GCD要高,因此建议在有特殊需求的复杂项目中使用。
GCD的最大优点是非常简单、易用,经过了官方的优化更加安全高效(多数函数是线程安全的)。对于不复杂的多线程操作,会节省代码量,尤其block参数的使用,使代码更为易读,建议在简单项目中广泛使用。
NSOperation和GCD的特点
NSOpertion如何实现线程依赖
对于a、b、c 3个线程,如何使用NSOpertion和NSOpertionQueue实现执行完a和b后再执行c的结果?
对于上述问题,其实可以通过NSOpertion的依赖特性实现,即让c依赖于a和b,这样只有a和b都执行完后,c才可以开始执行。
/*获取主队列(主线程)*/ NSOperationQueue *queue = [NSOperationQueue mainQueue]; /*创建a、b、c操作*/ NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"Operation A Start!"); [NSThread sleepForTimeInterval:3.0]; NSLog(@"Operation A Done!"); }]; NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"Operation B Start!"); [NSThread sleepForTimeInterval:3.0]; NSLog(@"Operation B Done!"); }]; NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"Operation C Start!"); //... ... }]; /*添加操作依赖,c依赖于a和b*/ [c addDependency:a]; [c addDependency:b]; /*添加操作a、b、c到操作队列queue(特意将c在a和b之前添加)*/ [queue addOperation:c]; [queue addOperation:a]; [queue addOperation:b];
程序的输出结果为: