zoukankan      html  css  js  c++  java
  • 线程间的通信(3种方式)

    三种方法都是通过touchesBegin监听屏幕的触摸实现

    一、performSelector方式

     1 #import "ViewController.h"
     2 @interface ViewController ()
     3 @property (weak, nonatomic) IBOutlet UIImageView *imageView;
     4 @end
     5 @implementation ViewController
     6 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
     7 {
     8     //放入子线程
     9     [self performSelectorInBackground:@selector(download3) withObject:nil];
    10 }
    11 
    12 //下载放入子线程,显示图片应该放在主线程!!!否则会导致刷新问题
    13 - (void)download3
    14 {
    15     //图片的网络路径
    16     NSURL *url = [NSURL URLWithString:@"http://ww2.sinaimg.cn/mw690/63e6fd01jw1f3f3rf75goj20qo0zkagy.jpg"];
    17     //下载图片数据
    18     NSData *data = [NSData dataWithContentsOfURL:url];
    19     
    20     //生成图片
    21     UIImage *image = [UIImage imageWithData:data];
    22     //回到主线程显示图片方法一:
    23 //    [self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES];
    24     //回到主线程显示图片方法二:
    25     //waitUntilDone:表示是否等待主线程做完事情后往下走,YES表示做完后执行下面事,NO表示跟下面事一起执行
    26     [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
    27     //回到主线程显示图片方法三:
    28     [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
    29 }
    30 //主线程显示图片
    31 - (void)showImage:(UIImage *)image
    32 {
    33     self.imageView.image = image;
    34 }

    二、GCD方式

     1 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
     2 {
     3     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
     4         //图片的网络途径
     5         NSURL *url = [NSURL URLWithString:@"http://ww2.sinaimg.cn/mw1024/75614297jw1f34e5llyz4j20qo0zj0zl.jpg"];
     6         //加载图片
     7         NSData *data = [NSData dataWithContentsOfURL:url];
     8         //生成图片
     9         UIImage *image = [UIImage imageWithData:data];
    10         //回到主线程
    11         dispatch_async(dispatch_get_main_queue(), ^{
    12             self.imageView.image = image;
    13         });
    14     });
    15     
    16 }

    三、operation方式(此种方式更具有面向对象特性!)

     1 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
     2 {
     3     //直接开始子线程执行任务
     4     [[[NSOperationQueue alloc] init] addOperationWithBlock:^{
     5         NSURL *url = [NSURL URLWithString:@"http://ww4.sinaimg.cn/mw690/63e6fd01jw1ezxz499hy5j21gt0z94qq.jpg"];
     6         NSData *data = [NSData dataWithContentsOfURL:url];
     7         UIImage *image = [UIImage imageWithData:data];
     8         //回到主线程
     9         [[NSOperationQueue mainQueue] addOperationWithBlock:^{
    10             //显示图片
    11             self.imageView.image = image;
    12         }];
    13     }];
    14 }

    以上三种方式都需要在main storyboard中拖一个imageView,然后设置自动布!!

  • 相关阅读:
    LeetCode 623. Add One Row to Tree
    LeetCode 894. All Possible Full Binary Trees
    LeetCode 988. Smallest String Starting From Leaf
    LeetCode 979. Distribute Coins in Binary Tree
    LeetCode 814. Binary Tree Pruning
    LeetCode 951. Flip Equivalent Binary Trees
    LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List
    LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal
    LeetCode 687. Longest Univalue Path
    LeetCode 428. Serialize and Deserialize N-ary Tree
  • 原文地址:https://www.cnblogs.com/hissia/p/5484724.html
Copyright © 2011-2022 走看看