美文网首页
GCD线程通讯

GCD线程通讯

作者: 摇滚鲨鱼 | 来源:发表于2016-11-02 23:05 被阅读21次

GCD线程通讯

    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
    dispatch_async(globalQueue, ^{
        NSLog(@"dispatch_async globalQueue begin !!! %@", [NSThread currentThread]);

        // 耗时操作
        NSString *str = @"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
        NSURL *url = [NSURL URLWithString:str];
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];
        
        // 回主线程,更新图片;
        dispatch_queue_t mainQueue = dispatch_get_main_queue();
        
        // 阻塞当前线程,等待block执行完毕后,向下执行
        //dispatch_sync(mainQueue, ^{
        
        // 不阻塞当前线程,直接执行下面的操作,无需等待block
        dispatch_async(mainQueue, ^{
            NSLog(@"image.size.width...%f", image.size.width);
            NSLog(@"mainQueue !!! %@", [NSThread currentThread]);

            self.imageView.image = image;
        });
        
        NSLog(@"dispatch_async globalQueue end !!! %@", [NSThread currentThread]);

    });

NSThread线程通讯

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSLog(@"Hello World ! 111111  %@", [NSThread currentThread]);
    [NSThread detachNewThreadSelector:@selector(downloadImage) toTarget:self withObject:nil];
    NSLog(@"Hello World ! 222222  %@", [NSThread currentThread]);

}

- (void)downloadImage {
    NSLog(@"downloadImage begin !!! %@", [NSThread currentThread]);
        
    NSString *str = @"http://sinastorage.com/storage.zone.photo.sina.com.cn/zone/img/20161101/eb1721bdb2e5b6d85534833d249a3bff.jpg?&ssig=tW2%2BnBxmjp&KID=sina,slidenews&Expires=1478091012";
    NSURL *url = [NSURL URLWithString:str];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];
    
    // 线程通信
    // 子线程回主线程
    // 1.定义一个loadImage方法,为imageView赋值
    //[self performSelectorOnMainThread:@selector(loadImage:) withObject:image waitUntilDone:NO];
    //[self performSelector:@selector(loadImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];
    
    // 2.使用imageView自带的setImage方法赋值
    [imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
    
    NSLog(@"downloadImage end !!! %@", [NSThread currentThread]);
}

- (void)loadImage:(id)obj {
    imageView.image = obj;
    NSLog(@"loadImage end !!! %@", [NSThread currentThread]);

}

相关文章

  • GCD线程通讯

    GCD线程通讯 NSThread线程通讯

  • 7.3 多线程-GCD

    多线程-GCD 多线程-GCD-串行并行 多线程-GCD.png GCD-线程的通讯、延时操作、定时器 GCD-线...

  • GCD的使用

    GCD的详解iOS多线程--彻底学会多线程之『GCD』 GCD线程之间的通讯 一般在主线程里面刷新UI 点击、滚动...

  • iOS开发经验(19)-多线程

    目录 pthread NSThread GCD NSOperation 线程锁 线程通讯 | 多线程实现方案 ...

  • GCD线程间的通讯

    在iOS开发过程中,我们一般在主线程里边进行UI刷新,例如:点击、滚动、拖拽等事件。我们通常把一些耗时的操作放在其...

  • iOS多线程:『GCD』详尽总结

    iOS多线程:『GCD』详尽总结 iOS多线程:『GCD』详尽总结

  • GCD创建线程数的上限

    检查GCD线程池大小的代码 结果 推论: GCD最多只能新建64个线程,即GCD线程池大小为64。 64个线程编号...

  • GCD(用法一)

    GCD线程通讯: 在iOS开发过程中,我们一般在主线程里边进行UI刷新。我们通常会把一些耗时的操作放在其他线程,比...

  • 多线程之GCD

    线程、多线程 多线程存在的问题 为什么使用多线程? GCD GCD 的 API 介绍Dispatch QueueD...

  • 关于多线程笔记

    1.GCD线程延迟 2.GCD后台执行 3.GCD主线程执行 4.GCD一次性执行

网友评论

      本文标题:GCD线程通讯

      本文链接:https://www.haomeiwen.com/subject/ymrbuttx.html