【iOS开发】多线程 - GCD

2017-09-21  本文已影响12人  Huangbaoqin

GCD(Grand Central Dispatch)俗称大中枢派发

改进的线程 dispatch_queue_t
dispatch_queue_t queue
//第一个参数为队列名,第二个参数为串行或者并行
dispatch_queue_t queue = dispatch_queue_create("com.huangbaoqin.GCDQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue = dispatch_queue_create("com.huangbaoqin.GCDQueue", DISPATCH_QUEUE_CONCURRENT); 
// 异步
dispatch_async(queue, ^{
    // do something
});
// 同步(必须执行完都something之后才会执行dispatch_sync之后的代码)
dispatch_sync(queue, ^{
    // do something
});

// #define DISPATCH_QUEUE_PRIORITY_HIGH 2
// #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
// #define DISPATCH_QUEUE_PRIORITY_LOW (-2)
// #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
// 不能取消
void
dispatch_after(dispatch_time_t when,
    dispatch_queue_t queue,
    dispatch_block_t block);

dispatch_async(_queue, ^{
    self.a ++;
})
多线程下单例产生两个对象
+ (instancetype)sharedObj {
    static singleOBJ *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[singleOBJ alloc] init];
    });
    return instance;
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    //  把Queue中的任务统一放到group中处理,在后台线程中等待group处理完成后切换到主线程操作UI

    _imageView1.image = nil;
    _imageView2.image = nil;
    _imageView3.image = nil;
    _imageView4.image = nil;
    __block UIImage *image1, *image2, *image3, *image4 = nil;
    
    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        image1 = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url1]]];
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        image2 = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url2]]];
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        image3 = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url3]]];
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        image4 = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url4]]];
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
        dispatch_async(dispatch_get_main_queue(), ^{
            _imageView1.image = image1;
            _imageView2.image = image2;
            _imageView3.image = image3;
            _imageView4.image = image4;
        });
    });
}
上一篇 下一篇

猜你喜欢

热点阅读