摘自《iOS程序员面试笔试宝典》
用户下载一个大图片,分成很多份下载,如何使用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];
程序的输出结果为:
网友评论