iOS多线程(下)代码

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多线程(下)代码)