美文网首页
iOS多线程(下)代码

iOS多线程(下)代码

作者: 贤宇 | 来源:发表于2016-02-13 10:19 被阅读44次

    1.NSObject

    - (IBAction)nsobjectAction:(UIButton *)sender { 
       NSLog(@"NSObject");   
     // 在后台执行(开辟多线程最简单的一个方法)    
    [self performSelectorInBackground:@selector(test) withObject:nil];
    }
    

    2.NSThread

    - (IBAction)nsthreadAction:(UIButton *)sender { 
      NSLog(@"NSThread");
        // NSThread是一个轻量级的多线程,创建方式有两种 
        // 1.init创建,并且需要手动开启
        // NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(test) object:nil];    
    // 开启线程    
     [thread start];    
    // 取消线程    
     [thread cancel];       
    // 2.初始化的同时自动开启子线程    
    [NSThread detachNewThreadSelector:@selector(test) toTarget:self withObject:nil];
    }
    

    3.NSOperation NSOperationQueue

    - (IBAction)operationAction:(UIButton *)sender { 
       NSLog(@"NSOperation”); 
    // 时间片轮转 
    // NSOperation是一个抽象类,他有两个子类 NSInvocationOperation 和 NSBlockOperation    
    // 在MVC里面属于M层,封装了单个任务的数据和相关的代码,一般我们使用子类    
    // NSOperation是一个操作,本身并无主线程子线程的区分,通常与NSOperationQueue结合使用       
    // NSInvocationOperation    
    NSInvocationOperation *invocatinOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test) object:nil];    
    // NSBlockOperation    
    __weak typeof (self)temp = self; 
    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{        [temp test];       
    NSLog(@"这是blockOperation操作执行的");    }];  
    // NSOperationQueue 是线程操作队列,用来管理一组合适Operation对象,会根据实际需求,创建出合适数量的子线程(不一定和任务个数一样),完成任务的并发执行  
     NSOperationQueue *queue = [[NSOperationQueue alloc] init];    
    // 设置最大并发执行数(当最大并发执行数为1的时候,程序是串行执行的)   
     [queue setMaxConcurrentOperationCount:1];   
    // 设置依赖关系[A addDependency:B]; 若A依赖B,则B先执行,A再执行   
     [invocatinOperation addDependency:blockOperation];       
    // 添加队列    
    [queue addOperation:invocatinOperation];
        [queue addOperation:blockOperation]; 
    }
    

    4.GCD

    - (IBAction)gcdAction:(UIButton *)sender {    
    NSLog(@"GCD");    
    // GCD有三种队列    
    // 主队列    
    // 全局队列    
    // 自定义队列(串行队列,并行队列)       
    __weak typeof (self)temp = self;    
    // 1.主队列(串行队列)
        // 获取主队列生成一个串行的队列,队列里面的block块,按照FIFO(先进先出)的顺序执行,实际上就是一个单线程队列
        // 创建队列 获取主线程
        dispatch_queue_t queue = dispatch_get_main_queue();    
    // 1)往主队列里面添加任务    
    dispatch_async(queue, ^{       
         [temp test];        
         NSLog(@"1");    
    });    
    dispatch_async(queue, ^{        
          [temp test];        
          NSLog(@"2");    
    });    
    dispatch_async(queue, ^{       
         [temp test];        
         NSLog(@"3");    
    });       
    // 2)延时任务 参数delayInSeconds:延时的时间    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{        
         NSLog(@"今晚如家402等你");    
    });    
    // 3)同步添加任务 (同步非常卡一般不用)    
    dispatch_sync(queue, ^{        
        [temp test];        
        dispatch_sync(queue, ^{            
           [temp test];        
        });   
    });   
        // 2.全局队列 (并发执行)
        // 创建队列
        // 第一个参数为优先级,这里选择默认
        dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    
    // 1)添加任务    
    dispatch_async(global, ^{        
        [temp test];        
        NSLog(@"1");    
    });    
    dispatch_async(global, ^{        
        [temp test];       
        NSLog(@"2");    
    });    
    dispatch_async(global, ^{        
        [temp test];       
        NSLog(@"3");    
    });     
    // 2)重复执行    
    // 第一个参数:重复执行的次数    
    // 第二个参数:指定执行的队列    
    // 第三个参数:size_t t  相当于变量int t    
    dispatch_apply(5, global, ^(size_t t) {        
         NSLog(@"执行到%ld次",t);    
    });       
    // 3.自定义队列    
    // 1)串行队列    
    // <1>    
    // 第一个参数: 标签    
    // 第二个参数: 串行队列 serial    
    dispatch_queue_t queue1 = dispatch_queue_create("AAA", DISPATCH_QUEUE_SERIAL);    dispatch_async(queue1, ^{        
        [temp test];        
        NSLog(@"1");    
    });    
    dispatch_async(queue1, ^{        
        [temp test];        
        NSLog(@"2");    
    });    
    dispatch_async(queue1, ^{        
        [temp test];        
        NSLog(@"3");    
    });       
    // <2>添加函数 把字符串传进函数里    
    dispatch_async_f(queue1, "testContext", function);
       
        // 2)并发队列 concurrent
        dispatch_queue_t queue2 = dispatch_queue_create("com.baidu", DISPATCH_QUEUE_CONCURRENT);    
    // <1>障碍执行    
    // 该方法创建的任务在执行的时候,会先检查是否有其他任务正在执行,若有,等待其执行完毕再执行,否则,其他任务要等待它执行完毕之后再执行    
    dispatch_barrier_async(queue2, ^{        
        [temp test];        
        NSLog(@"障碍执行");    
    });    
    // <2>分组任务    
    dispatch_group_t group = dispatch_group_create();    
    // 添加任务    
    dispatch_group_async(group, queue2, ^{
            [temp test];
            NSLog(@"1");
    });    
    dispatch_group_async(group, queue2, ^{
            [temp test];
            NSLog(@"2");    
    });    
    dispatch_group_async(group, queue2, ^{
            [temp test];
            NSLog(@"3");    
    });    
    // <3>拒绝拿第一 最后再执行    
    dispatch_group_notify(group, queue2, ^{
            NSLog(@"最后,去了如家402");    
    });    
    }
    

    子线程回到主线程(线程间通信)

     // 1.NSObject    
    // 1)    
    [self performSelectorOnMainThread:@selector(backMainThread) withObject:nil waitUntilDone:YES];    
    // 2)    
    [self performSelector:@selector(backMainThread) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];       
    // 2.GCD    
    dispatch_async(dispatch_get_main_queue(), ^{
            // 在这里面进行主线程任务的操作(UI刷新)
        });
    }
    - (void)backMainThread{
        NSLog(@"在该方法内实现主线程UI的刷新");
    }
    

    相关文章

      网友评论

          本文标题:iOS多线程(下)代码

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