iOS 多线程

iOS 多线程系列 -- GCD全解三(进阶)

2017-07-01  本文已影响92人  shannoon

iOS 多线程系列 -- 基础概述
iOS 多线程系列 -- pthread
iOS 多线程系列 -- NSThread
iOS 多线程系列 -- GCD全解一(基础)
iOS 多线程系列 -- GCD全解二(常用方法)
iOS 多线程系列 -- GCD全解三(进阶)
iOS 多线程系列 -- NSOperation
测试Demo的GitHub地址

4. GCD进阶:

4.1 Dispatch Source 调度源

4.1.1 Dispatch Source基础介绍
4.1.2 使用Dispatch Source步骤 ,以自定义source事件为例
    dispatch_source_set_event_handler(source, ^{
        NSLog(@"%lu 人已报名",dispatch_source_get_data(source));
    });
dispatch_source_set_cancel_handler(source, ^{
        NSLog(@"报名已终止");
    });

dispatch_resume(source);
//dispatch_activate(source);

dispatch_source_t  source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0,dispatch_get_main_queue());
    dispatch_source_set_event_handler(source, ^{
        NSLog(@"%lu 人已报名",dispatch_source_get_data(source));
    });
    dispatch_resume(source);
    dispatch_apply(5, dispatch_get_global_queue(0, 0), ^(size_t index) {
        NSLog(@"用户%zd 报名郊游",index);
        dispatch_source_merge_data(source, 1); // 触发事件,传递数据
    });
2017-07-01 18:34:30.514 Test - 多线程[66363:2522266] 用户2 报名郊游
2017-07-01 18:34:30.513 Test - 多线程[66363:2522111] 用户0 报名郊游
2017-07-01 18:34:30.513 Test - 多线程[66363:2522265] 用户1 报名郊游
2017-07-01 18:34:30.514 Test - 多线程[66363:2522359] 用户3 报名郊游
2017-07-01 18:34:30.514 Test - 多线程[66363:2522266] 用户4 报名郊游
2017-07-01 18:34:30.514 Test - 多线程[66363:2522111] 5 人已报名

4.1.3 使用Dispatch Source自定义定时器

在上面提到的几个步骤的基础上,还需要使用,dispatch_source_set_timer设置定时器属性,当然创建source的类型要选择DISPATCH_SOURCE_TYPE_TIMER

        dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta);
    dispatch_time_t dispatch_walltime(const struct timespec *_Nullable when, int64_t delta);

            #define NSEC_PER_SEC 1000000000ull
            #define NSEC_PER_MSEC 1000000ull
            #define USEC_PER_SEC 1000000ull
            #define NSEC_PER_USEC 1000ull
        #define DISPATCH_TIME_NOW (0ull)
        #define DISPATCH_TIME_FOREVER (~0ull)


- (void)dispatchTimer
{
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
    _timer = timer;
    //NSEC_PER_SEC宏其定义是1000000000纳秒,也就是1秒
    dispatch_source_set_timer(timer, dispatch_walltime(DISPATCH_TIME_NOW,1 * NSEC_PER_SEC), 1ull * NSEC_PER_SEC, 0);
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"-----handle dispatchTimer thread = %@",[NSThread currentThread]);
    });
    dispatch_source_set_cancel_handler(timer, ^{
        NSLog(@"-----cancel dispatchTimer thread = %@",[NSThread currentThread]);
    });
    dispatch_resume(timer);//启动定时器
}
4.1.4 Dispatch Source补充

4.2 dispatch semaphore

信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知(dispatch_semaphore_signal)和等待(dispatch_semaphore_wait).

4.2.1 操作dispatch semaphore的三个方法
dispatch_semaphore_t dispatch_semaphore_create(long value);
long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
long dispatch_semaphore_signal(dispatch_semaphore_t dsema);

4.2.2 进阶 - dispatch semaphore的实用场景

上面已经介绍dispatch semaphore的基本使用方法,那利用dispatch semaphore可以实现那些功能?

上一篇下一篇

猜你喜欢

热点阅读