iOS 多线程提升

2021-03-28  本文已影响0人  XieHenry
1.NSOprationQueue 与 GCD 的区别与选用?

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.多线程真题示例:
image.png image.png

原因:主队列的viewDidLoad需要block完成才会继续执行。
因为主队列的先进先出的性质,block需要viewDidLoad先完成才能提交。就会造成死锁。

image.png image.png
image.png
image.png

原因:gcd创建的线程默认情况下没有开辟RunLoop。但是performSelector需要在当前线程有runloop才能运行。

5. 出错前.png image.png
上一篇下一篇

猜你喜欢

热点阅读