多线程GCD之图片异步加载主队列刷新UI

再来说说GCD里面的异步加载,直接上代码,亲测

/* 常见的图片加载+UI刷新
 * 1,dispatch_async 异步队列
 * 开启一个新的线程来执行耗时操作,但是同时又不会阻塞线程,因为任务创建后可以在不完成的情况下直接跳过block块去做下一项任务,等里面的任务完成后又会回到block块里面继续执行
 * 比如,实现图片的加载是比较耗时的,所以必须要在异步线程里面执行
 * 加载完事后需要刷新UI,ui的刷新必须在主队列里面进行
 * 2,dispatch_get_global_queue(para1,para2),全局队列,系统给每一个应用程序提供了3个并发调度的全局队列concurrent dispatch queues,只有优先级是不同的。因为是全局的队列,所以我们不需去创建,是要调用dispatch_get_global_queue(para1,para2)这个即可
 * 3,dispatch_get_main_queue(),一般是在异步操作执行完后,返回到主队列完成一些ui的刷新工作
 * 4,废话不多说,直接上代码
 */
- (IBAction)createQueue:(id)sender {

    /* 创建异步队列
     * 参数1,当前开启的线程 在哪个线程中执行<#dispatch_queue_t queue#>
     * 参数2,block 块中要执行什么功能
     * 其中dispatch_get_global_queue(long identifier, <#unsigned long flags#>)  是子线程队列
       *  参数1,队列优先级
                DISPATCH_QUEUE_PRIORITY_HIGH 2
                DISPATCH_QUEUE_PRIORITY_DEFAULT 0
                DISPATCH_QUEUE_PRIORITY_LOW (-2)
                DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
       *参数2,一般默认传0
     */

    __weak __typeof (self)weakSelf = self;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{


        NSLog(@"2-开始在block块里面执行耗时操作");
        // 执行耗时操作
        weakSelf.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://static.oschina.net/uploads/user/136/272738_50.jpg?t=1409534522000"]]];

        // 耗时操作完事后,回到主队列,刷新UI
        // 当然也需要在异步队列里面做了
        // 或是直接调用
        NSLog(@"3-当耗时操作执行完后,又回到block里面执行,ui的刷新");
        dispatch_async(dispatch_get_main_queue(), ^{

            NSLog(@"4-执行主队列的刷新工作");
            self.loadImageView.image = weakSelf.image;
        });
    });

    NSLog(@"1-先从block里面跳出来");
}

打印结果:

2017-03-23 14:34:27.463831 test[10235:2206936] 1-先从block里面跳出来
2017-03-23 14:34:27.464144 test[10235:2206982] 2-开始在block块里面执行耗时操作
2017-03-23 14:34:28.600760 test[10235:2206982] 3-当耗时操作执行完后,又回到block里面执行,ui的刷新
2017-03-23 14:34:28.601296 test[10235:2206936] 4-执行主队列的刷新工作

你可能感兴趣的:(ios面试题及进阶知识点学习)