1.NSOprationQueue 与 GCD 的区别与选用?
NSThread、GCD、NSOperation多线程编程总结
多线程 GCD NSThread NSOperation
2.iOS系统为我们提供的几种多线程技术各自的特点是怎样的?
GCD
实现一些简单的线程同步。包括子线程的分派 多读单写 倒计时 单例等
NSOperation、NSOperationQunue
第三方框架AFNetworking,SDWebImage、因为对任务的状态进行控制的特点(添加依赖。移除依赖)。
NSThread
实现常驻线程。
3.NSOperation对象在Finished之后是怎样从queue当中移除掉的、
会在内部通过KVO
的方式通知他所对应的NSOperationQunue。然后移除.
4.怎么利用GCD实现多读单写?
创建一个并发队列。使用dispatch_sync同步读取指定数据。使用dispatch_barrier_async异步栅栏调用设置数据。
图示
5.使用GCD实现这个需求:A,B,C三个任务并发,完成后执行任务D?
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
// 执行1个耗时的异步操作
NSLog(@"%@",[NSThread currentThread]);
});
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
// 执行1个耗时的异步操作
NSLog(@"%@",[NSThread currentThread]);
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步操作都执行完毕后,回到主线程...
NSLog(@"结束");
});
6.多线程真题示例:
原因:主队列的viewDidLoad需要block完成才会继续执行。
因为主队列的先进先出的性质,block需要viewDidLoad先完成才能提交。就会造成死锁。
原因:gcd创建的线程默认情况下没有开辟RunLoop。但是performSelector需要在当前线程有runloop才能运行。
5. 出错前.png image.png
网友评论