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. 主队列:是一个在应用程序的主队列,这个队列和应用程序的运行循环交错执行

几个例子:

1、顺序队列异步执行

异步不阻塞

- (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(@"队列之后运行....");
}

2、顺序队列同步执行:

同步阻塞

- (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(@"队列之后运行....");
}

3、并发队列异步执行

- (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(@"队列之后运行....");
}

4、主线程队列

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

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

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

1、performSelector: withObject: afterDelay:

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

2、performSelectorOnMainThread: withObject: waitUntilDone:

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

3、scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:

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

原文地址:https://www.cnblogs.com/yaoxc/p/3730393.html