iOS开发之---多线程技术

iOS支持多个层次的多线程编程,层次越高抽象程度越高,使用起来也越方便,也是苹果推荐的方式。编程

  • Thread:最低抽象层次的,线程的管理、线程锁的设置与释放等都须要开发人员本身来负责,使用NSThread类来建立和管理线程。
  • Cocoa Operations:经过NSOperation类来管理线程。NSOperation是一个抽象基类,iOS提供了两个默认实现:NSInvocationOperation和NSBlockOperation。
  • Grand Central Dispatch(GCD):iOS 4开始支持GCD,它提供了一个全新的API,能够将应用程序须要执行的工做拆分为能够分散在多个线程多个cpu上更小的块。这个新API大部分使用程序块(Block)来访问。使用GCD,开发者须要作的惟一一件事就是定义须要执行的任务,并 把任务添加到合适的派遣队列(Dispatch Queue)中。GCD将负责建立线程,并将任务调度到合适的线程中。GCD技术使得线程管理已经成为系统的一部分,提供一个友好的任务管理和执行的方法,和传统的NSThread管理相比效率更高。

本节重点介绍GCD的使用:多线程

  • GCD派遣队列:是一个基于C语言的技术,队列能够按照顺序执行任务也能够同步执行任务,可是全部在队列里面的任务均按照“先进先出”的顺序。提交给派遣队列的任务必须封装成一个函数或者程序块(Block)。

 

  1. 顺序队列:
  2. 并发队列:也称全局派遣队列
  3. 主队列:是一个在应用程序的主队列,这个队列和应用程序的运行循环交错执行

几个例子:并发

一、顺序队列异步执行iphone

异步不阻塞异步

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"队列开始执行....");
    dispatch_queue_t queue ;
    queue = dispatch_queue_create("iphone.book.queue", NULL);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"队列之中运行...");
    });
    NSLog(@"队列以后运行....");
}

二、顺序队列同步执行:async

同步阻塞函数

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"队列开始执行....");
    dispatch_queue_t queue ;
    queue = dispatch_queue_create("iphone.book.queue", NULL);
    dispatch_sync(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"队列之中运行...");
    });
    NSLog(@"队列以后运行....");
}

三、并发队列异步执行oop

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"队列开始执行....");
    dispatch_queue_t queue ;
    queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"队列之中第一个任务运行...");
    });
    
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"队列之中第二个任务运行...");
    });
    
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"队列之中第三个任务运行...");
    });
    
    NSLog(@"队列以后运行....");
}

四、主线程队列spa

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"队列开始执行....");
    dispatch_queue_t queue ;
    queue = dispatch_get_main_queue();
    dispatch_async(queue, ^{
        lblInfo.text = 计算结果
    });
    
    NSLog(@"队列以后运行....");
}

 

【注】:异步执行代码的其它方法:线程

除了经过多线程的方式进行异步代码执行外,还有其它方式来进行异步操做

一、performSelector: withObject: afterDelay:

该方法是NSRunLoop对象针对NSObject类添加的类别(extension),所以基本全部的类都能执行该方法。

二、performSelectorOnMainThread: withObject: waitUntilDone:

该方法是NSThread类为NSObject类添加的方法。

三、scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:

经过NSTimer类的类方法,在必定的时间异步执行selector指定的方法。

相关文章
相关标签/搜索