浅谈 iOS 线程

标签: ios objective-c thread gcd | 发表时间:2015-08-08 00:23 | 作者:Richard_Gao
出处:http://segmentfault.com/blogs
  • 通常主线程和其他线程的使用场景
    主线程一般用于
    绘制UI
    响应用户操作等
    其他线程用于
    网络请求
    解析网络返回等

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

一般异步网络请求中会有一个 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 方法),也可以为了主线程的到一个特殊的队列(通过 dispatch_get_main_queue)。

一个 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 参数的地方还可以填 DISPATCH_QUEUE_SERIAL(等同于null)或者 DISPATCH_QUEUE_CONCURRENT。
DISPATCH_QUEUE_SERIAL :按先进先出原则执行 block 的 dispatch 队列。
DISPATCH_QUEUE_CONCURRENT:执行当前 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 使用的更详细的文章。

相关 [ios 线程] 推荐:

浅谈 iOS 线程

- - SegmentFault 最新的文章
通常主线程和其他线程的使用场景. Tips: 解压、打开 Zip 包,读写较大文件的操作也不宜放在主线程里. 一般异步网络请求中会有一个 completionBlock ,这个 completionBlock 是在主线程中被调用的. 所以,可能消耗大量时间的代码(例如上面提到的处理 Zip 包的方法)也不宜放在这些 block 中.

[IOS]iOS App性能优化

- - 操作系统 - ITeye博客
iOS App的性能关注点. 虽然iPhone的机能越来越好,但是app的功能也越来越复杂,性能从来都是移动开发的核心关注点之一. 我们说一个app性能好,不是简单指感觉运行速度快,而应该是指应用启动快速、UI反馈响应及时、列表滚动操作流畅、内存使用合理,当然更不能随随便便Crash啦. 工程师开发应用时除了在设计上要避免性能“坑”的出现,在实际遇到“坑”时也要能很快定位原因所在.

iOS 5评测

- littlepush - Solidot
Ars Technica的评测认为iOS 5值得升级,当然它也不可避免的存在一些小问题,给用户增添些烦恼. 用户在升级前最好手动备份一下iDevice,确保所有的应用都能转移.

关于iOS 7

- - 曉生
上手使用2天,感觉ios7的方向挺对,有设计的不错的地方,比如系统功能交互的完善和动效细节. 但界面有不够完善之处,比如颜色不够统一,难以理解相机和设置为什么用那么难看的渐变灰色,控制中心太像交互原型图,更主要是功能缺乏分类,但相信这只是beta版的问题,就像ios7运行还不够流畅一样,都还需要时间去完善.

[转]WebKit in iOS 8

- - justinjing的专栏
让我们说说iOS 8 的WebKit吧. WWDC 2014前几天,就有人发现了苹果向WebKit开源项目提交了一些很令人兴奋的代码,暗示了OS X和iOS,特别是iOS上的WebKit架构有所变化. 果不其然,WWDC上公布了iOS的新框架WebKit.framework,正式推出了新的网页浏览控件WKWebView.

Adobe Reader for iOS发布

- laguna - Solidot
tbw 写道 "Adobe也许在计算机桌面的PDF市场占统治地位,但是,Adobe基本上把iPhone和iPad等移动设备的PDF市场留给了竞争对手,如GoodReader和苹果的iBooks. Adobe在公司博客中宣布,它已推出iPhone和iPad通用的“Adobe Reader for iOS”软件.

iOS开发资源

- - Starming星光社最新更新
iOS App UI 欣赏、分享精美的App界面设计. iOS代码实例搜索、iOS特效示例、iOS代码例子下载. 以web的形式提供iOS UI设计的素材,你可以在web上拖动一些控件做出简单的ios 应用效果,并且生成一个URL,能分享给其他人. 一款 Photoshop 插件,由 UI Parade 推出的一款针对iOS UI 的设计工具,设计师动动鼠标即可制作精美的 iOS 应用原型.

iOS Web App初步

- - 新浪UED
iOS Web App开发,配合HTML5,是目前比较热门的话题. 今天,先抛开HTML5,我们来尝试在PhoneGap框架上进行简单的开发. PhoneGap是一个使用HTML,CSS和JavaScript的,创建移动跨平台移动应用程序的快速开发平台. 它使开发者能够利用iPhone,Android,Palm,Symbian,WP7,Bada和Blackberry等智能手机的核心功能——包括地理定位,加速器,联系人,声音和振动等,此外PhoneGap拥有丰富的插件,可以以此扩展无限的功能.

iOS 免费接口

- - ITeye博客
京东获取单个商品价格接口:. http://p.3.cn/prices/mgets?skuIds=J_商品ID&type=1. ps:商品ID这么获取:http://item.jd.com/954086.html. http://www.kuaidi100.com/query?type=快递公司代号&postid=快递单号.

ios代码开源

- - CSDN博客移动开发推荐文章
本人从10年开始搞ios开发,从菜鸟到现在的入门,期间遇到了许多困难,也总结了一些东西,本着开源精神,希望大家共同成长的目的把这个工程开源出来.. 这个工程是从11年到13年之前完成的.主要是我平时用到的一些基础功能模块.其中有其他开源的代码和我自己写的一些.代码结构基本乱,12年以后的代码结构还可以,不是很乱,之前水平有限,如果不怎么样就别喷我了.