iOS线程常用方法记录一下

2020-10-23  本文已影响0人  llt00
1、自定义串行队列
// 串行队列 SERIAL
dispatch_queue_t queue = dispatch_queue_create("SERIAL", DISPATCH_QUEUE_SERIAL);

    // 防止循环引用 使用 __weak 修饰
    __weak typeof(self)weakSelf = self;
    // 异步任务 分线程中执行 不会阻塞主线程
    dispatch_async(queue, ^{
        [weakSelf eat];
    });
   // 同步任务 主线程中执行 会阻塞当前线程
    dispatch_sync(queue, ^{        
        [weakSelf eat];
    });
2、自定义并行队列
// 并行队列 CONCURRENT
dispatch_queue_t queue2 = dispatch_queue_create("CONCURRENT", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue2, ^{
    [weakSelf eat];
});
dispatch_sync(queue2, ^{
    [weakSelf eat];
});
3、获取系统的4个并行队列
    dispatch_queue_t queue4 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue4, ^{
        [weakSelf eat];
    });
4、子线程中执行完之后,回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
     // 更新UI
});
5、所有任务执行完成后回调(执行任务为同步请求)
   dispatch_group_t group = dispatch_group_create();
   dispatch_group_async(group,queue2,^{执行任务A});
   dispatch_group_async(group,queue2,^{执行任务B});
   dispatch_group_async(group,queue2,^{执行任务C});
   dispatch_group_notify(group, dispatch_get_main_queue(), ^{
       NSLog(@"queue2的所有任务都执行完了");
   });
6、网络异步请求--(利用group)所有任务执行完成后回调
@property (nonatomic, strong, nullable) dispatch_group_t serviceGroup;
[SVProgressHUD showModalLoading];
self.serviceGroup = dispatch_group_create();
[self loadData];//加载数据
dispatch_group_notify(self.serviceGroup, dispatch_get_main_queue(), ^{
        [SVProgressHUD dismissModalLoadingView];
});
- (void)loadData {
    WS(weakSelf);
    dispatch_group_enter(self.serviceGroup);
    NSMutableDictionary *parameter = [NSMutableDictionary dictionary];
    parameter[@""] = @"";
    [[NetWorkingManager shareManager] GET:@"" parameters:parameter progress:^(NSProgress * _Nonnull uploadProgress) {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        dispatch_group_leave(weakSelf.serviceGroup);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
    }];
}
7、网络异步请求--(利用信号量)按顺序执行
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self loadDataWithSemaphore:semaphore];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    [self loadDataWithSemaphore:semaphore];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    [self loadData3];
});

- (void)loadDataWithSemaphore:(dispatch_semaphore_t)semaphore {
    WS(weakSelf);
    NSMutableDictionary *parameter = [NSMutableDictionary dictionary];
    parameter[@""] = @"";
    [[NetWorkingManager shareManager] GET:@"" parameters:parameter progress:^(NSProgress * _Nonnull uploadProgress) {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        dispatch_semaphore_signal(semaphore);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
    }];
}
上一篇 下一篇

猜你喜欢

热点阅读