说一下线程之间的通信

作者: 商鞅福泽谕吉 | 来源:发表于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];
    

    相关文章

      网友评论

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

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