线程
1. iOS 中有多少类型的线程?
- PThread:跨系统,对C语言的封装。很少使用,不推荐使用。
- NSThread:面向对象,需要手动管理生命周期。
- GCD:Grand Central Dispatch,主打任务与队列。
- NSOperation & NSOperationQueue:基于GCD的封装,面向对象。
2. GCD 有那些队列,默认提供那些队列?
- 主队列:dispatch_get_main_queue
- 全局并发队列:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
- 自定义队列:dispatch_queue_create("队列名字", DISPATCH_QUEUE_SERIAL)
3. GCD 栅栏函数
栅栏函数用来处理多读单写事件,使用如下:
dispatch_queue_t queue = dispatch_queue_create("testqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"----1-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----2-----%@", [NSThread currentThread]);
});
dispatch_barrier_async(queue, ^{
NSLog(@"----barrier-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----3-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----4-----%@", [NSThread currentThread]);
});
注意:栅栏函数使用时,不能使用全局队列,只能使用自定义的队列。
3.1 dispatch_barrier_sync
和 dispatch_barrier_async
的区别?
- dispatch_barrier_sync:前面的 block 全部添加并执行完成之后,再执行barrier 中的内容。然后再添加并执行之后的 block 内容。会影响主线程的执行。
- dispatch_barrier_async:将前面的 block 全部添加之后,再添加 barrier,再添加之后的block,然后再依次执行。不影响主线程的执行。