zoukankan      html  css  js  c++  java
  • iOS多线程邂逅

    1.线程之间的通信
    
    //有一个特别耗时的操作,比如说网络请求,开启子线程去请求网络,我们一般是要在主线程更新UI,如何从子线程跳转到主线程?
    
    #import "ViewController.h"
    
     @interface ViewController ()
    
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;
    
    @end
    
    @implementation ViewController
    
     
    
    - (IBAction)downLoadImage:(id)sender {
    
        
    
        [self performSelectorInBackground:@selector(loadImage) withObject:nil];
    
     
    
    }
    
     
    
    - (void)loadImage {
    
        
    
        NSLog(@"loadImage - %@",[NSThread currentThread]);
    
        
    
        NSString * urlString = @"http://design.yesky.com/uploadImages/2009/335/20091201140951681.jpg";
    
        
    
        NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
    
        
    
        UIImage * image = [UIImage imageWithData:data];
    
        
    
        //waitUntilDone
    
        
    
    //    [self performSelectorOnMainThread:@selector(changeMainThread:) withObject:image waitUntilDone:NO];
    
        
    
    //    [self performSelector:@selector(changeMainThread:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
    
        
    
        [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];
    
         // waitUntilDone:是什么意思?
    
        // YES:等待loadImage:这个方法执行完毕之后,再执行当前线程后续的操作
    
        // NO:不等待loadImage:这个方法执行完毕,就执行当前线程后续的操作
    
        
    
        NSLog(@"waitUntilDone");
    
        
    
    //    self.imageView.image = image;
    
     
    
    }
    
    2.GCD基础
    
    核心概念
    
     任务:block里需要执行的操作
    
     队列:把任务添加进入队列中,按照先进先出的原则来执行任务
    
     
    
     串行队列:一个一个的执行
    
     并行队列:可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效。
    
     
    
     同步任务:不会开辟新的线程,任务在当前的线程中执行,同时任务是立刻执行
    
     异步任务:会开辟新的线程(主队列不可以),任务在新开辟的线程执行(主队列在主线程中执行),不是立刻  执行任务
    
     
    
     同步任务串行队列:不会开启新的线程,当前的线程中顺序执行任务
    
     同步任务并行队列:不会开启新的线程,当前的线程中执行任务,立刻执行任务
    
     异步任务串行队列:会开辟一个新的线程,在新开辟的线程中执行任务,不是立刻执行
    
     异步任务并行队列:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行
    
     
    
     主队列(特殊的串行队列):任务只会在主线程中调度,不会开辟新的线程(一般用于刷新UI)
    
     异步任务主队列:不会开辟新的线程,当前的线程中执行任务,不会立刻执行任务
    
     同步任务主队列:死锁
    
     
    
     全局队列(并行队列):全局队列供给应用程序共享,可以设置优先级
    
     
    
     开辟新的线程:由任务决定,同步任务不会开辟新的线程,异步任务会开辟新的线程(主队列不会开辟新的线程)
    
     开辟多少线程:由队列决定,串行队列只会开启一个线程,并行队列会开辟多个线程,具体多少个由任务的数量和GCD的底层来决定的
    
     
    
     */
    
    - (void)gcdTest6 {
    
        
    
        dispatch_queue_t queue = dispatch_get_main_queue();
    
        
    
        NSLog(@"1");
    
        
    
        //在主队列里执行同步操作,产生死锁
    
        
    
        //原因:同步线程等待主线程结束,才会执行任务。主线程等待同步立即执行,才会执行下一个任务。
    
        
    
        dispatch_sync(queue, ^{
    
            NSLog(@"2");
    
        });
    
        
    
        NSLog(@"3");
    
     
    
    }
    
     
    
    - (void)gcdTest5 {
    
        
    
        // 主队列就是一种特殊的串行队列
    
        // 特点:专门负责在主线程上调度任务,不会再子线程中去调度任务,无论是同步或异步中调用任务都只会在主线程上面执行
    
        
    
        dispatch_queue_t queue = dispatch_get_main_queue();
    
        
    
        NSLog(@"开始");
    
        
    
        for (NSInteger i = 0; i < 10; i ++) {
    
            //主队列执行异步操作,异步操作有一个等待的过程
    
            dispatch_async(queue, ^{
    
                NSLog(@"%@",[NSThread currentThread]);
    
            });
    
        }
    
        
    
        NSLog(@"结束");
    
    }
    
     
    
    //并发队列:多个线程同时执行
    
    //同步操作:不会开启新的线程
    
    //执行结果:不会开启新的线程,立即执行
    
     
    
    - (void)gcdTest4 {
    
        
    
        dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);
    
        
    
        NSLog(@"开始");
    
        
    
        for (NSInteger i = 0 ; i < 10; i ++ ) {
    
            
    
            dispatch_sync(queue, ^{
    
                NSLog(@"%@,%@",[NSThread currentThread],@(i));
    
            });
    
        }
    
        
    
        NSLog(@"结束");
    
    }
    
     
    
    //并发队列:多个线程同时执行
    
    //异步操作:会开启新的线程
    
    //执行结果:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行
    
     
    
    - (void)gcdTest3 {
    
        
    
        //开启并发队列
    
        dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);
    
        
    
        NSLog(@"开始");
    
        
    
        for (NSInteger i = 0 ; i < 10; i ++ ) {
    
            
    
            //执行异步操作
    
            dispatch_async(queue, ^{
    
                
    
                NSLog(@"%@",[NSThread currentThread]);
    
            });
    
        }
    
        
    
        NSLog(@"结束");
    
    }
    
     
    
    //串行队列:一个一个执行
    
    //异步操作:会开启新的线程
    
    //执行结果:开启一个新的线程,在新开辟的线程中执行任务,不是立刻执行
    
     
    
    - (void)gcdTest2 {
    
        
    
        dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", NULL);
    
        
    
        
    
        NSLog(@"开始");
    
        
    
        for (NSInteger i = 0 ; i < 10; i ++ ) {
    
            
    
            //异步请求
    
            dispatch_async(queue, ^{
    
                
    
                NSLog(@"%@,%@",[NSThread currentThread],@(i));
    
                
    
            });
    
        }
    
        
    
        NSLog(@"结束");
    
        
    
        
    
    }
    
     
    
    //串行队列:一个一个执行
    
    //同步操作:不开启新的线程
    
    //执行结果:不开启新的线程,一个一个顺序执行
    
     
    
    - (void)gcdTest1 {
    
        
    
        //label:队列名
    
        //attr:队列属性(串行,并发)
    
        //DISPATCH_QUEUE_SERIAL 串行
    
        //DISPATCH_QUEUE_CONCURRENT 并发
    
        
    
        //#define DISPATCH_QUEUE_SERIAL NULL
    
        
    
        dispatch_queue_t queue = dispatch_queue_create("com.bjsxt",DISPATCH_QUEUE_SERIAL);
    
        
    
        NSLog(@"开始");
    
        //同步操作
    
        //操作任务:block
    
        dispatch_sync(queue, ^{
    
            //打印当前线程
    
            NSLog(@"%@",[NSThread currentThread]);
    
        });
    
        
    
        NSLog(@"结束");
    
          
    
    }
    
    3.GCD线程之间通信
    
     
    
    #import "ViewController.h"
    
     
    
    @interface ViewController ()
    
     
    
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;
    
     
    
    @end
    
     
    
    @implementation ViewController
    
     
    
    - (IBAction)downLoadImage:(id)sender {
    
        
    
        NSLog(@"%@",[NSThread currentThread]);
    
        
    
        //获取全局队列
    
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
        
    
        //执行异步操作
    
        dispatch_async(queue, ^{
    
        
    
            NSLog(@"%@",[NSThread currentThread]);
    
            
    
            NSString * urlString = @"http://design.yesky.com/uploadImages/2009/335/20091201140951681.jpg";
    
            
    
            NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
    
            
    
            UIImage * image = [UIImage imageWithData:data];
    
            
    
            //返回主线程更新UI
    
            dispatch_async(dispatch_get_main_queue(), ^{
    
                
    
                NSLog(@"%@",[NSThread currentThread]);
    
     
    
                self.imageView.image = image;
    
     
    
            });
    
        });
    
        
    
    }
    
     
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    
        
    
        //同步操作用途
    
        
    
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
        
    
        dispatch_sync(queue, ^{
    
            NSLog(@"登录");
    
        });
    
        
    
        dispatch_async(queue, ^{
    
            NSLog(@"下载斗破苍穹");
    
        });
    
        
    
        dispatch_async(queue, ^{
    
            NSLog(@"下载大主宰");
    
        });
    
    }
  • 相关阅读:
    mysql系列---【如何利用存储过程,造10万条测试数据?】
    sql_视图和函数
    sql的一些知识_数据分组
    sql的一些知识_函数_汇总数据
    sql的一些知识_计算字段
    sql的一些知识_通配符
    sql的一些知识_where
    sql的一些知识_order by
    sql的一些知识
    chardet的使用
  • 原文地址:https://www.cnblogs.com/iOSlearner/p/5277428.html
Copyright © 2011-2022 走看看