iOS、swift技术交流!

iOS多线程技术

2016-10-31  本文已影响19人  光明程辉

1:performSelector 多线程

/*
 *使用performSelector 的多线程
 *优点:简单
 *缺点:没有串行并线队列,不能实现高级线程调度
 */
 
-(void)performSelectorFunction{
    
    NSLog(@"performSelectorFunction start");

    //同步方式执行
    //[self performSelector:@selector(function1)];
    
    //延迟两秒执行,主线程阻塞
    //[self performSelector:@selector(function1) withObject:nil afterDelay:2];

    //主线程上执行,主线程阻塞,waitUntilDone:YES:等待执行完成顺序执行,waitUntilDone:NO 现执行后面语句
    //[self performSelectorOnMainThread:@selector(function1) withObject:nil waitUntilDone:NO];
    
    //子线程上执行
    [self performSelectorInBackground:@selector(function1) withObject:nil];
    
    NSLog(@"performSelectorFunction end");
    
}

2:NSThread

/*
 *使用NSThread 的多线程
 *优点:简单
 *缺点:没有串行并线队列,不能实现高级线程调度,和performSelector是一样的。
 */

-(void)NSThreadFunction{
    
    NSLog(@"NSThreadFunction start");
    
    //线程暂停 2秒
    //[NSThread sleepForTimeInterval:2];
    
    //显示创建的方式执行
    //NSThread *myThread = [[NSThread alloc]initWithTarget:self selector:@selector(function1) object:nil];
    //[myThread start];
    
    //静态方法执行线程
    //[NSThread detachNewThreadSelector:@selector(function1) toTarget:self withObject:nil];
    
    NSLog(@"NSThreadFunction end");
    
}

3:NSTimer(反面教材,他不是多线程,他只是定时执行任务)

/*
 *使反面教材,他不是多线程,他只是定时执行任务
 */

-(void)NSTimerFunction{
    
    NSLog(@"NSTimerFunction start");
    
    //定时执行任务,可以重复和不重复
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(function1) userInfo:nil repeats:NO];
    
    //暂时停止定时器
    //[timer setFireDate:[NSDate distantFuture]];
    //重新开启定时器
    //[timer setFireDate:[NSDate distantPast]];
    //永久通知定时器
    //[timer invalidate];
    //timer = nil;
    
    NSLog(@"NSTimerFunction end");
    
}

4:GCD最棒的多线程使用api

GCD 中主要的对象:


// dispatch_sync 同步方式执行:
 dispatch_sync(dispatch_get_global_queue(0, 0), ^{
      // something
 });


// dispatch_async 异步执行:
 dispatch_async(dispatch_get_global_queue(0, 0), ^{
      // something
 });

 // dispatch_async:主线程执行:
 dispatch_async(dispatch_get_main_queue(), ^{
      // something
 });

 // dispatch_once:一次性执行:
 static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
     // code to be executed once
 });

 //dispatch_time_t :延迟2秒执行:
 double delayInSeconds = 2.0;
 dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
 dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
     // code to be executed on the main queue after delay
 });

 //dispatch_group_t: 合并汇总结果
 dispatch_group_t group = dispatch_group_create();
 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
      // 并行执行的线程一
 });
 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
      // 并行执行的线程二
 });
 dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
      // 汇总结果
 });


 //dispatch_barrier_async :作用是在并行队列中,等待前面的队列执行完成后在继续往下执行
dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentQueue, ^(){
    NSLog(@"dispatch-1");
});
dispatch_async(concurrentQueue, ^(){
    NSLog(@"dispatch-2");
});
dispatch_barrier_async(concurrentQueue, ^(){
    NSLog(@"dispatch-barrier"); 
});
dispatch_async(concurrentQueue, ^(){
    NSLog(@"dispatch-3");
});
dispatch_async(concurrentQueue, ^(){
    NSLog(@"dispatch-4");
});

//dispatch_apply:将一个指定的block执行指定的次数,常用语block数组。在一般方法中虽然block中的方法并不是顺序执行,但是由于apply是线程同步的,
//所以print(dispatch_apply done);一定最后执行。常常可以这样用:
let globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(globalQueue, { () -> Void in
    dispatch_apply(10, globalQueue) { (index) -> Void in
        print(index)
    }
    print("completed")
})
print("在dispatch_apply之前") 


//dispatch_suspend / dispatch_resume
//暂停
dispatch_suspend(globalQueue)
//恢复
dispatch_resume(globalQueue)

//Dispatch Semaphore 这个是线程的信号量,比较复杂

参考

http://liuyanwei.jumppo.com/2015/08/19/ios-ThreadAndAsynchronization.html
http://blog.csdn.net/zhangao0086/article/details/38904923

上一篇下一篇

猜你喜欢

热点阅读