说一下线程之间的通信

作者: 商鞅福泽谕吉 | 来源:发表于2018-07-31 18:00 被阅读0次
  • 线程之间的通信基本概念: 在一个进程中,线程往往不是孤立存在的,多个线程之间经常需要进行通信;
  • 线程之间通信的体现: 一个线程传递数据给另一个线程; 在一个线程中执行完任务之后转到另一个线程继续执行任务;
  • 线程之间通信的常用的方法:

1)NSThread方法:

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

2)gcd方法

 dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
// 1.下载图片(耗时)
dispatch_async(queue, ^{
//分线程中执行好事操作
    dispatch_sync(dispatch_get_main_queue(), ^{
        主线程中更新ui
    });
});

3)NSOperation
方法1:

// 1.创建一个新的队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

// 2.添加任务(操作)  
[queue addOperationWithBlock:^{
    // 2.1在子线程中下载图片
    NSURL *url  = [NSURL URLWithString:@"http://imgcache.mysodao.com/img2/M04/8C/74/CgAPDk9dyjvS1AanAAJPpRypnFA573_700x0x1.JPG"];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];

    // 2.2回到主线程更新UI
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        self.imageView.image = image;
    }];
}];

方法2:(添加依赖库)

/ 1.创建一个队列
    // 一般情况下, 在做企业开发时候, 都会定义一个全局的自定义队列, 便于使用
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    // 2.添加一个操作下载第一张图片
    __block UIImage *image1 = nil;
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSURL *url  = [NSURL URLWithString:@"http://imgcache.mysodao.com/img2/M04/8C/74/CgAPDk9dyjvS1AanAAJPpRypnFA573_700x0x1.JPG"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        image1 = [UIImage imageWithData:data];
    }];

    // 3.添加一个操作下载第二张图片
    __block UIImage *image2 = nil;
     NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSURL *url  = [NSURL URLWithString:@"http://imgcache.mysodao.com/img1/M02/EE/B5/CgAPDE-kEtqjE8CWAAg9m-Zz4qo025-22365300.JPG"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        image2 = [UIImage imageWithData:data];
    }];
    // 4.添加一个操作合成图片
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        UIGraphicsBeginImageContext(CGSizeMake(200, 200));
        [image1 drawInRect:CGRectMake(0, 0, 100, 200)];
        [image2 drawInRect:CGRectMake(100, 0, 100, 200)];
        UIImage *res = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        // 5.回到主线程更新UI
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            self.imageView.image = res;
        }];
    }];

    // 6.添加依赖

    [op3 addDependency:op1];
    [op3 addDependency:op2];

    // 7.添加操作到队列中
    [queue addOperation:op1];
    [queue addOperation:op2];
    [queue addOperation:op3];

相关文章

  • Java内存模型

    线程之间的通信和同步 线程之间的通信和同步是并发编程领域的关键问题。 线程之间的通信 通信是指线程之间以何种机制来...

  • 线程间通信

    线程间通信就是子线程和主线程之间的通信

  • 说一下线程之间的通信

    线程之间的通信基本概念: 在一个进程中,线程往往不是孤立存在的,多个线程之间经常需要进行通信; 线程之间通信的体现...

  • 线程与线程,进程与进程之间的通信

    线程与线程之间的通信 一,为什么要线程通信? 1>多个线程...

  • iOS开发多线程--线程通信

    线程之间的通信 简单说明线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信。 线程间通...

  • Java内存模型分析

    在学习Java内存模型之前,先了解一下线程通信机制。 1、线程通信机制 在并发编程中,线程之间相互交换信息就是线程...

  • java多线程(八)JMM和底层实现原理

    线程之间的通信线程的通信是指线程之间以何种机制来交换信息。在编程中,线程之间的通信机制有两种,共享内存和消息传递。...

  • ios 多线程的故事4

    线程间通信 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个...

  • 最详细分析Java 内存模型

    并发编程中, 线程之间如何通信及线程之间如何同步, 通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间...

  • Java线程通信-线程协调API

    线程通信 想要实现多个线程之间的协同,如:线程执行顺序,获取某个线程执行结果等,则需要使用线程之间互相通信。 文件...

网友评论

    本文标题:说一下线程之间的通信

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