Runtime

GCD入门

2018-07-16  本文已影响0人  我只是个仙

讲在前面

GCD、NSOperation、NSThread哪个你比较中意呢?我用的GCD很顺手啊,相信很多人也和我一样,会对GCD熟悉的不能再熟悉,原理巴拉多网上也是一堆一堆的,这里咱们就讲讲实战好了。

GCD分类

按照类型分为: 串行(serial queue)和并行(concurrent queue)
按照系统提供api分为: 主线程(main queue)、全局线程(global queue)和自定义线程(custom queue)
  • 其中main queue通过dispatch_get_main_queue()获取,是主线程,属于serial queue;
  • global queue通过dispatch_get_global_queue()获取,是全局队列,属于concurrent queue;
  • custom queue 通过dispatch_queue_create()方法定义

需要注意的几点:

GCD相关API

dispatch_serial_queue

dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
    NSLog(@"1");
});
 dispatch_async(serialQueue, ^{
    NSLog(@"2");
});
 dispatch_async(serialQueue, ^{
    NSLog(@"3");
});
 dispatch_async(serialQueue, ^{
    NSLog(@"4");
});
 dispatch_async(dispatch_get_main_queue(), ^{
    self.title = @"hello";
});

输出结果:

2018-07-15 19:55:36.940535+0800 GCDDemo[12328:651362] 1
2018-07-15 19:55:36.940688+0800 GCDDemo[12328:651362] 2
2018-07-15 19:55:36.940781+0800 GCDDemo[12328:651362] 3
2018-07-15 19:55:36.940889+0800 GCDDemo[12328:651362] 4

dispatch_concurrent_queue

dispatch_group_async(self.groupQueue,dispatch_get_global_queue(0, 0), ^{
    NSLog(@"1");
});
dispatch_group_async(self.groupQueue,dispatch_get_global_queue(0, 0), ^{
    NSLog(@"2");
});
dispatch_group_async(self.groupQueue,dispatch_get_global_queue(0, 0), ^{
    NSLog(@"3");
});
dispatch_group_async(self.groupQueue,dispatch_get_global_queue(0, 0), ^{
    NSLog(@"4");
});
dispatch_group_async(self.groupQueue,dispatch_get_global_queue(0, 0), ^{
    NSLog(@"5");
});
dispatch_group_notify(self.groupQueue, dispatch_get_global_queue(0, 0), ^{
    NSLog(@"group queue end.");
});

输出结果:

2018-07-15 20:00:21.782358+0800 GCDDemo[12418:657731] 2
2018-07-15 20:00:21.782368+0800 GCDDemo[12418:657728] 3
2018-07-15 20:00:21.782378+0800 GCDDemo[12418:657732] 4
2018-07-15 20:00:21.782358+0800 GCDDemo[12418:657729] 1
2018-07-15 20:00:21.782505+0800 GCDDemo[12418:657731] 5
2018-07-15 20:00:21.782612+0800 GCDDemo[12418:657731] group queue end.

dispatch_barrier_async GCD的栅栏方法
栅栏前加入队列的任务全部执行完之后,才会执行栅栏任务,栅栏任务执行完后再执行栅栏后加入队列的任务。

dispatch_queue_t queue = dispatch_queue_create("queue.barrier.tmp", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10; i++) {
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"%d   %@",i,[NSThread currentThread]);
    });
    if(i == 5) {
        dispatch_barrier_async(queue, ^{
            NSLog(@"barrier %d   %@",i,[NSThread currentThread]);
        });
    }
}

输出结果:

2018-07-16 10:51:54.247399+0800 GCDDemo[63628:24167474] 2   <NSThread: 0x60c00026ff40>{number = 3, name = (null)}
2018-07-16 10:51:54.247406+0800 GCDDemo[63628:24167475] 3   <NSThread: 0x60400007fb80>{number = 4, name = (null)}
2018-07-16 10:51:54.247410+0800 GCDDemo[63628:24167472] 4   <NSThread: 0x600000461340>{number = 7, name = (null)}
2018-07-16 10:51:54.247414+0800 GCDDemo[63628:24167473] 1   <NSThread: 0x6080002607c0>{number = 6, name = (null)}
2018-07-16 10:51:54.247410+0800 GCDDemo[63628:24167471] 0   <NSThread: 0x60000027ed40>{number = 5, name = (null)}
2018-07-16 10:51:54.247411+0800 GCDDemo[63628:24167499] 5   <NSThread: 0x60c0002700c0>{number = 8, name = (null)}
2018-07-16 10:51:54.247900+0800 GCDDemo[63628:24167499] barrier 5   <NSThread: 0x60c0002700c0>{number = 8, name = (null)}
2018-07-16 10:51:56.250672+0800 GCDDemo[63628:24167473] 9   <NSThread: 0x6080002607c0>{number = 6, name = (null)}
2018-07-16 10:51:56.250669+0800 GCDDemo[63628:24167499] 6   <NSThread: 0x60c0002700c0>{number = 8, name = (null)}
2018-07-16 10:51:56.250669+0800 GCDDemo[63628:24167474] 7   <NSThread: 0x60c00026ff40>{number = 3, name = (null)}
2018-07-16 10:51:56.250679+0800 GCDDemo[63628:24167471] 8   <NSThread: 0x60000027ed40>{number = 5, name = (null)}

dispatch_group_t

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSLog(@"group start");
dispatch_group_async(group, queue, ^{
    dispatch_group_enter(group); // @1
    NSLog(@"group one start");
    dispatch_async(queue, ^{
        sleep(1);
        NSLog(@"group one finish");
        dispatch_group_leave(group);//@2
    });
});

dispatch_group_notify(group, queue, ^{
    NSLog(@"group finished");
});

dispatch_after 延时调用

NSLog(@"%@",[NSDate date]);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    NSLog(@"%@",[NSDate date]);
    NSLog(@"hello world");
});

输出结果:

2018-07-16 11:53:52.032397+0800 GCDDemo[64332:24322897] Mon Jul 16 11:53:52 2018
2018-07-16 11:53:54.229555+0800 GCDDemo[64332:24322897] Mon Jul 16 11:53:54 2018
2018-07-16 11:53:54.229737+0800 GCDDemo[64332:24322897] hello world

别着急还有很多~

上一篇下一篇

猜你喜欢

热点阅读