美文网首页
线程间通信/线程间发消息

线程间通信/线程间发消息

作者: 行走在北方 | 来源:发表于2018-11-17 17:54 被阅读11次

    1、利用最好用的GCD操作
    可以取外面的值作为参数,也可以在刷新主线程用外边的参数或者Block的参数

    NSString* parameter = [self getSomeParameter];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSString* result = [self fetchResultFromWebWithParameter:parameter];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self updateUIWithResult:result];
        });
    });
    

    2、performSelector使用
    //点击屏幕开始执行下载方法

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        [self performSelectorInBackground:@selector(download) withObject:nil];
    }
    
    //下载图片
    - (void)download
    {    
        // 1.图片地址
        NSString *urlStr = @"http://d.jpg";
        
        NSURL *url = [NSURL URLWithString:urlStr];
        
        // 2.根据地址下载图片的二进制数据
       
        NSData *data = [NSData dataWithContentsOfURL:url];
        NSLog(@"---end");
        
        // 3.设置图片
        UIImage *image = [UIImage imageWithData:data];
        
        // 4.回到主线程,刷新UI界面(为了线程安全)
        [self performSelectorOnMainThread:@selector(downloadFinished:) withObject:image waitUntilDone:NO];
        
       // [self performSelector:@selector(downloadFinished:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
        
        
    }
    
    - (void)downloadFinished:(UIImage *)image
    {
        self.imageView.image = image;
        
        NSLog(@"downloadFinished---%@", [NSThread currentThread]);
    }
    

    3、oprationQue操作

    // 1.创建队列
        NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
        // 2.添加操作
        [queue addOperationWithBlock:^{
            // 异步进行耗时操作
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
                NSLog(@"1---%@", [NSThread currentThread]); // 打印当前线程
            }
    
            // 回到主线程
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                // 进行一些 UI 刷新等操作
                for (int i = 0; i < 2; i++) {
                    [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
                    NSLog(@"2---%@", [NSThread currentThread]); // 打印当前线程
                }
            }];
        }];
    

    文章为学习使用,借鉴网络,如有问题请私聊

    相关文章

      网友评论

          本文标题:线程间通信/线程间发消息

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