iOS多线程---GCD中线程的通信

在子线程的任务完成后,有时候需要从子线程回到主线程,刷新UI。 从子线程中回到主线程,以前已经写过一种方法:

   [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];

现在GCD又提供了一种方法:

  dispatch_async(dispatch_get_main_queue(), ^{
          self.imageView.image=image;
  });

示例代码:

//
//  ViewController.m
//  GCDTest
//
//  Created by 登 on 2017/6/16.
//  Copyright ? 2017年 登. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"主线程----%@",[NSThread mainThread]);

}

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event
{
    //1 获取一个全局队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    // 2 把任务添加到队列中执行
    dispatch_async(queue, ^{

        //打印当前的线程
        NSLog(@"%@",[NSThread currentThread]);

        //3.从网络下载图片
        NSURL *urlStr = [NSURL URLWithString:@"http://h.hiphotos.baidu.com/baike/w%3D268/sign=30b3fb747b310a55c424d9f28f444387/1e30e924b899a9018b8d3ab11f950a7b0308f5f9.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:urlStr];
        UIImage *image = [UIImage imageWithData:data];

        //提示
        NSLog(@"图片加载完毕");

        //4.回到主线程,展示图片
       // [self.imageView performSelectorOnMainThread:@selector(setImageView:) withObject:image waitUntilDone:NO];
        dispatch_async(dispatch_get_main_queue(), ^{
            _imageView.image = image;

            NSLog(@"%@",[NSThread currentThread]);
        });
    });

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end

打印结果:

2017-06-16 17:55:45.848 GCDTest[15011:2269875] 主线程----<NSThread: 0x60800007f600>{number = 1, name = main}

2017-06-16 17:56:43.391 GCDTest[15011:2269966] <NSThread: 0x60000026b980>{number = 3, name = (null)}

2017-06-16 17:56:43.463 GCDTest[15011:2269966] 图片加载完毕

2017-06-16 17:56:43.463 GCDTest[15011:2269875] <NSThread: 0x60800007f600>{number = 1, name = main}

 

本文参考:http://www.cnblogs.com/wendingding/p/3807265.html

时间: 2024-10-12 08:34:40

iOS多线程---GCD中线程的通信的相关文章

深入IOS多线程 GCD(一)

一,什么是GCD GCD是异步执行任务的技术之一,一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的dispatch queue中,GCD就能生成必要的线程并计划执行任务.由于线程管理师作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率. 也就是说GCD用我们难以置信的非常简单的记述方法,实现了极为复杂的多线程编程,可以说这是一项划时代的技术.下面是使用了GCD源码的例子,虽然稍微抽象,但从中也能感受到GCD的威力 d

iOS多线程 GCD

iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. *

iOS多线程GCD

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. * * @discussi

boost中asio网络库多线程并发处理实现,以及asio在多线程模型中线程的调度情况和线程安全。

1.实现多线程方法: 其实就是多个线程同时调用io_service::run for (int i = 0; i != m_nThreads; ++i)        {            boost::shared_ptr<boost::thread> pTh(new boost::thread(                boost::bind(&boost::asio::io_service::run,&m_ioService)));            m_l

iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用

目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案:pthread,NSThread,GCD,NSOperation 线程安全问题 NSThread的使用 GCD的理解与使用 NSOperation的理解与使用 Demo在这里:WHMultiThreadDemo Demo的运行gif图如下: 一.多线程的基本概念 进程:可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位,是操作

IOS中线程的通信

一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 线程间通信常用方法 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SEL)aSelector onThr

iOS多线程——GCD篇

什么是GCD GCD是苹果对多线程编程做的一套新的抽象基于C语言层的API,结合Block简化了多线程的操作,使得我们对线程操作能够更加的安全高效. 在GCD出现之前Cocoa框架提供了NSObject类的 performSelectorInBackground:withObject performSelectorOnMainThread 方法来简化多线程编程技术. GCD可以解决以下多线程编程中经常出现的问题:1.数据竞争(比如同时更新一个内存地址) 2.死锁(互相等待) 3.太多线程导致消耗

IOS 多线程GCD的使用[转载于新浪微博, 原作者:太阳石]

原文 在红黑联盟上看到一篇关于多线程GCD的教程文章,写的深入浅出,特转载于此,以备不时之需.原文链接另:补充两个GCD代码,都是Xcode snippet里面提供的:1.Dispatch After主要用于延迟执行一些代码.例子: int64_t delayInSeconds = 1.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_aft

iOS 多线程GCD的基本使用

<iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 /** * 异步函数 + 并发队列:可以同时开启多条线程 */ - (void)asyncConcurrent { // 1.创建一个并发队列 // dispatch_queue_create(const char *label, dispatch_queue_attr_t attr); // label