iOS GCD使用场景总结

多线程在开发过程中的使用场景很多,它可以帮助我们更好的实现某些功能点。

GCD之间通信

场景:在耗时操作的处理时,先让其在子线程执行,等执行完成回主线程刷新。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 处理耗时操作
    for (NSInteger i = 0; i < 5; i++) {
        NSLog(@"第%ld次任务的主线程为: %@", i, [NSThread currentThread]);
    }
    // 回主线程刷新UI
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"回到主线程, 该线程为: %@", [NSThread currentThread]);
    });
});

GCD的栅栏方法

场景: 当我们需要进行异步操作两组数据时, 要求执行完第一组之后, 才能执行第二组

dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{
    NSLog(@"第一次任务的主线程为: %@", [NSThread currentThread]);
});

dispatch_async(queue, ^{
    NSLog(@"第二次任务的主线程为: %@", [NSThread currentThread]);
});

dispatch_barrier_async(queue, ^{
    NSLog(@"第一次任务, 第二次任务执行完毕, 继续执行");
});

dispatch_async(queue, ^{
    NSLog(@"第三次任务的主线程为: %@", [NSThread currentThread]);
});

dispatch_async(queue, ^{
    NSLog(@"第四次任务的主线程为: %@", [NSThread currentThread]);
});

延迟执行

场景:延迟执行,这个就不多说了

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    NSLog(@"2秒后执行了.");
});

只执行一次

场景: 单利

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{
    // 这里写只执行一次的任务就好了, 默认是线程安全, 所以不用担心
});

Queue Group

场景: 网络请求中等待多个请求结束再操作

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t serialQueue = dispatch_queue_create("com.wzb.test.www", DISPATCH_QUEUE_SERIAL);
dispatch_group_enter(group);
dispatch_group_async(group, serialQueue, ^{
    // 网络请求一
    [WebClick getDataSuccess:^(ResponseModel *model) {
        dispatch_group_leave(group);
    } failure:^(NSString *err) {
        dispatch_group_leave(group);
    }];
});
dispatch_group_enter(group);
dispatch_group_async(group, serialQueue, ^{
    // 网络请求二
    [WebClick getDataSuccess:getBigTypeRM onSuccess:^(ResponseModel *model) {
        dispatch_group_leave(group);
    }                                  failure:^(NSString *errorString) {
        dispatch_group_leave(group);
    }];
});
dispatch_group_enter(group);
dispatch_group_async(group, serialQueue, ^{
    // 网络请求三
    [WebClick getDataSuccess:^{
        dispatch_group_leave(group);
    } failure:^(NSString *errorString) {
        dispatch_group_leave(group);
    }];
});

// 所有网络请求结束后会来到这个方法
dispatch_group_notify(group, serialQueue, ^{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            // 刷新UI
        });
    });
});