多线程

串行

串行队列 Main Dispatch Queue(主队列) 自己创建的 dispatch_queue_create("com.example.MyQueue", DISPATCH_QUEUE_SERIAL);

并行

global dispatch queue全局队列 Concurrent队列 系统 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 自己创建的 dispatch_queue_create("com.example.MyQueue", DISPATCH_QUEUE_CONCURRENT); `系统提供主队列 和 四个全局的并行队列` 自己创建的队列都会被分发到系统的队列执行,但是dispatch_barrier 这样的系统函数传入的参数应当是自己创建的并行队列,否则barrier会失效。 `iOS6 以上就需要使用 strong 或者 weak 来修饰` @property (nonatomic, strong) dispatch_queue_t queue; iOS6 上这个改变,把 dispatch queue 从原来的非 OC 对象(原生 C 指针),变成了 OC 对象 `添加任务的方式 同步添加/异步添加` // 异步添加 dispatch_async(myCustomQueue, ^{ printf("做一些工作\n"); }); printf("第一个 block 可能还没有执行\n"); // 同步添加 dispatch_sync(myCustomQueue, ^{ printf("做另外一些工作\n"); }); 同步方式会阻塞当前线程的执行,等待添加的任务执行完毕之后,才继续向下执行,同步和异步添加只影响是不是阻塞当前线程 不要给串行队列(主队列) 用 同步添加的方式添加任务会产生死锁,除非在并行队列中。 同步和异步添加,与队列是串行队列和并行队列没有关系。 如果在任务 block 中创建了大量对象,可以考虑在 block 中添加 autorelease pool。 `NSOperation 有如下几种的运行状态:` Pending Ready Executing Finished Canceled `GCD 与 NSOperation 的对比` 首先要明确一点,NSOperationQueue 是基于 GCD 的更高层的封装,从 OS X 10.10 开始可以通过设置 underlyingQueue 来把 operation 放到已有的 dispatch queue 中。 从易用性角度,GCD 由于采用 C 风格的 API,在调用上比使用面向对象风格的 NSOperation 要简单一些。 从对任务的控制性来说,NSOperation 显著得好于 GCD,和 GCD 相比支持了 Cancel 操作(注:在 iOS8 中 GCD 引入了 dispatch_block_cancel 和 dispatch_block_testcancel,也可以支持 Cancel 操作了),支持任务之间的依赖关系,支持同一个队列中任务的优先级设置,同时还可以通过 KVO 来监控任务的执行情况。这些通过 GCD 也可以实现,不过需要很多代码,使用 NSOperation 显得方便了很多。 从第三方库的角度,知名的第三方库如 AFNetworking 和 SDWebImage 背后都是使用 NSOperation,也从另一方面说明对于需要复杂并发控制的需求,NSOperation 是更好的选择(当然也不是绝对的,例如知名的 Parse SDK 就完全没有使用 NSOperation,全部使用 GCD,其中涉及到大量的 GCD 高级用法,这里有相关解析)。

最近的文章

NSURLSession

NSURLSession 包括了与之前相同的组件,NSURLRequest 与 NSURLCache,但是把 NSURLConnection 替换成了 NSURLSession、NSURLSessionConfiguration 以及 NSURLSessionTask 的 3 个子类:NSURLSessionDataTask,NSURLSessionUploadTask,NSURLSessionDownloadTask。…

继续阅读
更早的文章

下载网页的视频!

人物:发小(电脑小白),我(iOS开发),阿宝(前端开发)时间:大晚上的临近睡点地点:厦门,深圳,北京工具:电脑,Google浏览器,微信起因:发小公司需要一个网页上的视频,他需要在第二天来到之前把视频准备好。于是她自己想了好久,到了睡点不行了开始求救,我就是她当时想到的救世主。经过:我只是略懂html,碰到这么紧急的事情又关于前端的事情,能最快解决的方法当然要求助阿宝喽,于是问了一下,阿宝的义气就不多描述了,打开电脑,同步学习从网页下载视频的步骤。步骤如下: 使用Google打开源码 ...…

继续阅读