浅谈 iOS 线程

一般主线程和其余线程的使用场景

主线程通常用于网络

  • 绘制UI数据结构

  • 响应用户操做等异步

其余线程用于async

  • 网络请求spa

  • 解析网络返回等线程

Tips: 解压、打开 Zip 包,读写较大文件的操做也不宜放在主线程里。code

通常异步网络请求中会有一个 completionBlock ,这个 completionBlock 是在主线程中被调用的。
因此,可能消耗大量时间的代码(例如上面提到的处理 Zip 包的方法)也不宜放在这些 block 中。以下面的代码所示:对象

[request setCompletionBlock:^{
    NSLog(@"Zip file downloaded.");
    NSData *data = [request responseData];
    [self processZip:data sourceURL:sourceURL]; // Ack - heavy work on main thread!
}];

那么,若是在blcok 中有数据须要花费大量时间处理,咱们可使用 Grand Central Dispatch(GCD)系统,让数据在后台被处理,或者使用GCD在后台执行这些代码。简单来讲,若是但愿有代码在后台执行,只须要调用 dispatch_async,而后把代码扔进去。
接来下的事就交给 GCD 啦,若是须要,GCD 会建立一个新的线程;或者 GCD 会重用一个已经存在的可用线程。排序

当你调用 dispatch_async 的时候,就是将代码传入了一个 dispatch 队列,这个队列里存储了全部你传入的 block。队列

咱们能够建立本身的 dispatch 队列(经过 dispatch create 方法),也能够为了主线程的到一个特殊的队列(经过 dispatchgetmainqueue)。

一个 dispatch 队列(queue)是按次序排设好的,这就意味着队列中每次只有一个 block 的代码被执行。这个特性很是方便,咱们能够用它保护共享数据(shared data)。
关于保护数据的核心思想是:你须要设置好你的代码,使得一个特定的数据结构只能被一个特定的正在运行的 dispatch 队列所访问。由于 dispatch 队列按次序执行 block,那么每次就只有一个block 可以访问该数据结构。

GCD 实践

预先声明一个dispatch_queue,添加一个 dispatch queue 实例

// Add new instance variable
dispatch_queue_t backgroundQueue;

关于 dispatch_queue_t 苹果官方文档说明:一个 dispatch queue 是一个用来注册将要被按顺序执行的代码块的轻量级对象。

建立dispatch queue

backgroundQueue = dispatch_queue_create("com.razeware.imagegrabber.bgqueue", NULL);

初始化前面说声明的 dispatch queue,并给这个dispatch queue 命名。上面填 null 参数的地方还能够填 DISPATCHQUEUESERIAL(等同于null)或者 DISPATCHQUEUECONCURRENT。
DISPATCHQUEUESERIAL :按先进先出原则执行 block 的 dispatch 队列。
DISPATCHQUEUECONCURRENT:执行当前 block 的 dispatch 队列。虽然该队列执行的是当前的代码,咱们也可使用 barrier block 在队列中建立同步点。

使用刚才建立的 dispatch queue

  • (void)process {

    dispatch_async(backgroundQueue, ^(void) {
        [self processHtml];
    });

    }

本来 - (void)process 中的代码是直接执行 [self processHtml]; processHTMl 方法阻塞了主线程,而如今经过调用 dispatch_async 咱们可使得 processHtml 在咱们建立的 backgroundQueue 中在后台运行。

关于NSOperations 和 operation 序列

NSOperations 其实就是基于 GCD 实现的,使用NSOperation 的时候其实也就是在使用 GCD。可是NSOperation 给咱们提供了更多更方便的功能,咱们能够操做一些 operation,这些operation 依赖于其余 operation。还能够在 submit block 以后从新对 operation queue 进行排序。

Bingo!以后应该会总结一些关于 GCD 使用的更详细的文章。

相关文章
相关标签/搜索