07-GCD线程间的通讯

GCD的线程间的通讯


  • 刷新UI必须在主队列中刷新
  • 如果在子队列中刷新可能会不显示刷新结果
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"--------");
    // 1.除主队列以外, 随便搞一个队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    // 2.调用异步函数
    dispatch_async(queue, ^{
        // 1.下载图片
        NSURL *url = [NSURL URLWithString:@"http://pic.4j4j.cn/upload/pic/20130531/07ed5ea485.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        // 2.将二进制转换为图片
        UIImage *image = [UIImage imageWithData:data];
        
        // 3.回到主线程更新UI
//        self.imageView.image = image;
        /*
         技巧:
         如果想等UI更新完毕再执行后面的代码`设置图片完毕`, 那么使用同步函数
         如果不想等UI更新完毕就需要执行后面的代码`设置图片完毕`, 那么使用异步函数
         */
        dispatch_sync(dispatch_get_main_queue(), ^{
            self.imageView.image = image;
        });
        NSLog(@"设置图片完毕 %@", image);
    });
}


小技巧

在解决死锁的时候 / 异步并发中调用主队列(调用方式的选择:同步/异步)
  • 如果想等UI更新完毕再执行后面的代码设置图片完毕, 那么使用同步函数
  • 如果不想等UI更新完毕就需要执行后面的代码设置图片完毕, 那么使用异步函数
// 1.除主队列以外, 随便搞一个队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
// 2.调用异步函数
    dispatch_async(queue, ^{
        // 1.下载图片
        NSURL *url = [NSURL URLWithString:@"http://pic.4j4j.cn/upload/pic/20130531/07ed5ea485.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        // 2.将二进制转换为图片
        UIImage *image = [UIImage imageWithData:data];

        /*
         技巧:
         如果想等UI更新完毕再执行后面的代码`设置图片完毕`, 那么使用同步函数
         如果不想等UI更新完毕就需要执行后面的代码`设置图片完毕`, 那么使用异步函数
         */
        dispatch_sync(dispatch_get_main_queue(), ^{
            self.imageView.image = image;
        });
        NSLog(@"设置图片完毕 %@", image);
    });
posted @ 2015-09-03 16:20  紫之灵玲  阅读(138)  评论(0编辑  收藏  举报