• 线程间通信的三种方式(NSThread,GCD,NSOperation)


    一.NSThread线程间通信

    #import "ViewController.h"

    @interface ViewController ()<UIScrollViewDelegate>

    @property (strong, nonatomic) IBOutlet UIScrollView *scrollView;

    @property (weak, nonatomic)  UIImageView *imageView;

    @end

    @implementation ViewController

    - (void)viewDidLoad {

        [super viewDidLoad];

      

        //1.创建我们的UIImageView

        [self createUIImageView];

        

        //2.去网络上下载图片

        NSString *URLString = @"http://e.hiphotos.bdimg.com/album/pic/item/9345d688d43f8794f0ab07ddd01b0ef41ad53ae8.jpg";

        [self performSelectorInBackground:@selector(loadImage:) withObject:URLString];

        

        //3.设置最大最小缩放比例

        self.scrollView.maximumZoomScale  = 2.0;

        self.scrollView.minimumZoomScale  = 0.5;

    }

    /**

     去子线程下载图片

     */

    - (void)loadImage:(NSString *)URLString{

        NSLog(@"---loadImage start---");

        

        //1.生成NSURL

        NSURL *url = [NSURL URLWithString:URLString];

        

        //2.去网络上下载,网络上传输的都是一堆01010的二进制

        NSData *imageData = [NSData dataWithContentsOfURL:url];

        

        //3.将我们的imageData转成我们UIImage

        UIImage *image = [UIImage imageWithData:imageData];

        

        /**

            waitUntilDone 等我们的updateUI 方法执行完毕之后,再执行后面的

         */

        [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:NO];

        

        NSLog(@"---loadImage end---");

    }

    - (void)updateUI:(UIImage *)image{

        //1.将image设置给imageView

        self.imageView.image = image;

        

        //2.根据我们的图片大小,来决定我们UIImageView的尺寸

        [self.imageView sizeToFit];

        

        //3.设置scrollView的contentSize

        self.scrollView.contentSize = image.size;

        

        NSLog(@"update UI end");

    }

    - (void)createUIImageView{

        UIImageView *imageView =[[UIImageView alloc] init];

        [self.scrollView addSubview:imageView];

        self.imageView = imageView;

    }

    #pragma mark - scrollViewDelegate

    - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{

        return self.imageView;

    }

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

        NSLog(@"%s",__func__);

    }

    @end

    二.GCD线程间通信

    #import "ViewController.h"

    @interface ViewController ()<UIScrollViewDelegate>

    @property (strong, nonatomic) IBOutlet UIScrollView *scrollView;

    @property (weak, nonatomic)  UIImageView *imageView;

    @end

    @implementation ViewController

    - (void)viewDidLoad {

        [super viewDidLoad];

      

        //1.创建我们的UIImageView

        [self createUIImageView];

        

        //2.去网络上下载图片

        /**

            去子线程,并发,全局,串行         方法:异步

            

            两个参数

            参数1:队列

            参数2:任务

         */

        dispatch_async(dispatch_get_global_queue(0, 0), ^{

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

            

            //0.URLString

            NSString *URLString = @"http://e.hiphotos.bdimg.com/album/pic/item/9345d688d43f8794f0ab07ddd01b0ef41ad53ae8.jpg";

            

            //1.生成NSURL

            NSURL *url = [NSURL URLWithString:URLString];

            

            //2.去网络上下载,网络上传输的都是一堆01010的二进制

            NSData *imageData = [NSData dataWithContentsOfURL:url];

            

            //3.将我们的imageData转成我们UIImage

            UIImage *image = [UIImage imageWithData:imageData];

            

            //去主线程更新UI

            dispatch_async(dispatch_get_main_queue(), ^{

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

                //1.将image设置给imageView

                self.imageView.image = image;

                

                //2.根据我们的图片大小,来决定我们UIImageView的尺寸

                [self.imageView sizeToFit];

                

                //3.设置scrollView的contentSize

                self.scrollView.contentSize = image.size;

            });

        });

        

        

        //3.设置最大最小缩放比例

        self.scrollView.maximumZoomScale  = 2.0;

        self.scrollView.minimumZoomScale  = 0.5;

    }

    - (void)createUIImageView{

        //1.创建imageView

        UIImageView *imageView =[[UIImageView alloc] init];

       

        [self.scrollView addSubview:imageView];

        

        self.imageView = imageView;

    }

    #pragma mark - scrollViewDelegate

    - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{

        return self.imageView;

    }

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

        NSLog(@"%s",__func__);

    }

    @end

    三.NSOperation线程间通信

    #import "ViewController.h"

    @interface ViewController ()<UIScrollViewDelegate>

    @property (strong, nonatomic) IBOutlet UIScrollView *scrollView;

    @property (weak, nonatomic)  UIImageView *imageView;

    @end

    @implementation ViewController

    - (void)viewDidLoad {

        [super viewDidLoad];

      

        //1j.创建我们的UIImageView

        [self createUIImageView];

        

        //2.去网络上下载图片

        

        //先去子线程做耗时操作(下载)  然后再去主线程更新UI

        

        //创建并发队列

        NSOperationQueue  *queue = [[NSOperationQueue alloc] init];

        

        [queue addOperationWithBlock:^{

           //子线程

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

            

            //0.URLString

            NSString *URLString = @"http://e.hiphotos.bdimg.com/album/pic/item/9345d688d43f8794f0ab07ddd01b0ef41ad53ae8.jpg";

            

            //1.生成NSURL

            NSURL *url = [NSURL URLWithString:URLString];

            

            //2.去网络上下载,网络上传输的都是一堆01010的二进制

            NSData *imageData = [NSData dataWithContentsOfURL:url];

            

            //3.将我们的imageData转成我们UIImage

            UIImage *image = [UIImage imageWithData:imageData];

            

            //去主线程更新UI

            [[NSOperationQueue mainQueue] addOperationWithBlock:^{

                //主线程

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

                //1.将image设置给imageView

                self.imageView.image = image;

                

                //2.根据我们的图片大小,来决定我们UIImageView的尺寸

                [self.imageView sizeToFit];

                

                //3.设置scrollView的contentSize

                self.scrollView.contentSize = image.size;

            }];

            

        }];

        

        

        //3.设置最大最小缩放比例

        self.scrollView.maximumZoomScale  = 2.0;

        self.scrollView.minimumZoomScale  = 0.5;

    }

    - (void)createUIImageView{

        UIImageView *imageView =[[UIImageView alloc] init];

        

        [self.scrollView addSubview:imageView];

        

          self.imageView = imageView;

    }

    #pragma mark - scrollViewDelegate

    - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{

        return self.imageView;

    }

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

        NSLog(@"%s",__func__);

    }

    @end

  • 相关阅读:
    ViewState
    Insert
    Copy: 了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密
    How to check number of Active connections in SQL server?
    (转)IIS6上启用Gzip压缩(HTTP压缩) 详解
    Reference (SQL Server 2005自动异机备份)
    [转] ios中KeyChain用途
    ios 中的事件
    unity3d 鼠标事件穿透GUI界面的问题
    Unity StartCoroutine注意的问题
  • 原文地址:https://www.cnblogs.com/donghaoios/p/5103659.html
Copyright © 2020-2023  润新知