concurrencyProgrammingGuide 1
thread用来表述执行代码的独立path。os x的线程执行基于POSIX 线程API.
process用来表述一个运行操作,可以包含多个线程。
task用来描述工作的抽象概念。
Concurrency and Application Design
不是依赖threads,os x和ios使用的是asynchronous design approach来解决并发的问题。异步函数在操作系统中已经使用多年用来初始化可能需要花费大量时间的task,比如从disk读取数据。当被调用的时候,异步函数会在后台执行一些操作然后在task可能完成前返回。首先,这个工作就包含了后台thread,在thread上执行desired task然后给caller发送通知的功能。在之前,如果一个异步函数不存在,你需要写你自己的异步函数并且创建线程。但是现在,os x和ios提供的技术使得你可以执行任何的异步任务而且不用再管理线程。
其中的一个异步任务技术就是Grand Central Dispatch (GCD)。这个技术负责线程管理code并且把他设置为sysytem level。你只需要定义想执行的task并且把它们添加到一个合适的dispathch queue中就可以了。gcd负责创建需要的线程并且将你的tasks分配在这些线程中运行。因为线程管理不是系统部分,gcd比传统线程提供一个整体的途径来管理和执行提供更好更有效的操作。
Operation queues 是objective c对象集合非常像dispathch queues。你定义想要执行的tasks并且添加到operation queue中,它负责安排和执行这些tasks。像gcd,operation queue为你处理所有的线程管理,确保tasks执行得又快又好。
Dispatch Queues
是基于c的执行自定义tasks的机制。一个dispatch queue总是以串行或者并发的方式执行任务。先进先出的原则。串行dispatch queue每次只执行一个task。要等待当前的task完成后才执行新的task。相反的,并发的dispatch queue会同时启动多个tasks而不需要等待其他的task完成。
dispatch queues还有其他的优点:
它们提供一个直接的并且简单的编程接口
它们提供自动的和整体的线程池管理
它们提供协调好的集合加速
它们有更多的内存空间。
Serial dispatch queues offer a more efficient alternative to locks and other synchronization primitives.
你提交给dispatch queue的tasks必须封装在函数或者block对象中。
Dispatch Sources
异步处理特定类型系统事件的基于c的机制。dispatch source疯长一个特定类型的系统事件并且当有事件发生时提交一个特定的block对象或者函数到dispatch queue中。你可以使用dispatch sources来映射以下类型的系统事件:
- Timers
- Signal handlers Descriptor-related events Process-related events
- Mach port events
- Custom events that you trigger
Asynchronous Design Techniques
你采用并发前应当考虑是否有这个必要首先。如果使用不当不会使得你的程序运行流畅反而会更慢甚至影响用户操作。
Define Your Application’s Expected Behavior
- 首先你需要估计出你的应用程序使用的tasks和每个task相关联的对象或者data structures。首先,你可能想在用户选择一个menu item或者点击一个button的时候开始执行一个task。就是要首先列出high-level tasks。
- 然后把每个task细分成一系列的步骤来确保task执行成功。这时你需要主要关注有关data structures和objects的一系列修改。并且这些修改将会如何影响你的应用程序。
- 而且你要关注objects和data structures之间的dependencies。如果修改一处不会影响其他的那么就可以考虑使用并发。
When to Use Threads
要看情况是否需要创建线程。当implement code必须在real time时运行就可以考虑使用线程。dispatch queues 会尽可能快地运行tasks但是它们不address real time 约束。如果你想在后台执行,线程可能更合适。
Operation Queues
About Operation Objects
operation object是一个NSOperation类型的实例。
NSInvocation-Operation : 创建一个operation object
NSBlockOperation: 并发执行一个或者多个block objects
NSOpretion:自定义operaiton object
Creating an NSInvocationOperation Object
当运行时,调用你指定对象的selector。使用这个类来防止为每一个task定义大量的自定义operation objects。特别是当你正在修改一个现有的程序并且已经有一些objects和methods需要执行tasks的时候。
创建一个invocation 类型实例,传送想要的object和selector。例子如下:
@implementation MyCustomClass
- (NSOperation*)taskWithData:(id)data { NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myTaskMethod:) object:data]; return theOp;
}
// This is the method that does the actual work of the task.
- (void)myTaskMethod:(id)data {
// Perform the task.
}@end
Creating an NSBlockOperation Object
封装一个或者多个block objects。当你创建一个block operation时,你其实至少添加了一个block在初始化阶段。你也可以添加多个blocks。当执行NSBlockOperation object时,object提交所有的blocks到默认优先级的并发dispatch queue.object会等待所有的blocks执行完成。当最后一个block执行完成后,operation object就会标记自己完成了。以下就是创建了一个NSBlockOperation object. block没有参数并且没有返回显示结果的例子:
NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{
NSLog(@"Beginning operation.\n");
// Do some work.}];
addExecutionBlock 用来创建更多的blocks。如果你需要blocks串行执行,那么你必须直接把它们提交到想要的dispatch queue中。
Defining a Custom Operation Object
你可以子类化NSOperation并且添加任何你想要的操作。
Performing the Main Task
每一个operation object应该执行至少两个方法:
- 一个custom initialization method
- main
你需要一个自定义的初始化方法来把你的operation object放到一个知道的状态并且还要有一个main方法来执行你的task。你可以执行额外需要的方法如下:
- Custom methods that you plan to call from the implementation of your main method
- Accessor methods for setting data values and accessing the results of the operation
- Methods of the NSCoding protocol to allow you to archive and unarchive the operation object
例子如下:
@interface MyNonConcurrentOperation : NSOperation
@property id (strong) myData;
-(id)initWithData:(id)data;
@end
@implementation MyNonConcurrentOperation
- (id)initWithData:(id)data {
if (self = [super init])
myData = data;
return self;
}
-(void)main {
@try {
// Do some work on myData and report the results.
}
@catch(...) {
// Do not rethrow exceptions.
} }
@end
Responding to Cancellation Events
当一个operation开始执行时,直到完成或者显示得cancel掉这个operation否则继续执行。调用isCancelled 方法来支持一个operation object的cancellation操作。当设计你的operation objects的时候,你应该考虑在如下的地方调用isCancelled方法:
Immediately before you perform any actual work 在你执行任何切实的工作之前
At least once during each iteration of a loop, or more frequently if each iteration is relatively long 至少一旦每一个loop或者更频繁的时候
At any points in your code where it would be relatively easy to abort the operation 代码中可能会容易打断操作的地方
例子:isCancelled方法在一个while循环中被调用,在work开始前允许快速exit
- (void)main {
@try {
BOOL isDone = NO;
while (![self isCancelled] && !isDone) {
// Do some work and set isDone to YES when finished
} }
@catch(...) {
// Do not rethrow exceptions.
} }
concurrencyProgrammingGuide 1的更多相关文章
- ios batchRequest
https://github.com/facebook/pop AF 为什么要用 一个线程去进行 1.这有什么好处 因为其生产额外的线程也要 开销的 asi 和af都是这么去做的 2.本身所 ...
- ios 总结
1 ocoa Touch Layer{ App Extensions https://developer.apple.com/library/ios/documentation/General/Con ...
- iOS多线程的初步研究(九)-- dispatch源
dispatch源(dispatch source)和RunLoop源概念上有些类似的地方,而且使用起来更简单.要很好地理解dispatch源,其实把它看成一种特别的生产消费模式.dispatch源好 ...
- 【转】并发编程之GCD
http://blog.xcodev.com/blog/2013/11/04/gcd-intro/ Dispatch Queue Dispatch Queue是一个任务执行队列,可以让你异步或同步地执 ...
- iOS 并发概念浅析
在进行iOS开发过程中,我们常会遇到网络请求.复杂计算.数据存取等比较耗时的操作,如果处理不合理,将对APP的流畅度产生较大影响.除了优化APP架构,并发(concurrency)是一个常用且较好的解 ...
- 巧谈 GCD
转载自:http://www.jianshu.com/p/665261814e24 谈到iOS多线程,一般都会谈到四种方式:pthread.NSThread.GCD和NSOperation.其中,苹果 ...
- IOS多线程 总结 -------------核心代码(GCD)
//NSObject //在子线程中执行代码 // 参数1: 执行的方法 (最多有一个参数,没有返回值) //参数2: 传递给方法的参数 [self performSelectorInBackgrou ...
- gcd - b- 201611302317
谈到iOS多线程,一般都会谈到四种方式:pthread.NSThread.GCD和NSOperation.其中,苹果推荐也是我们最经常使用的无疑是GCD.对于身为开发者的我们来说,并发一直都很棘手,如 ...
- 深入浅出Cocoa多线程编程之 block 与 dispatch quene
深入浅出 Cocoa 多线程编程之 block 与 dispatch quene 罗朝辉(http://www.cppblog.com/kesalin CC 许可,转载请注明出处 block 是 Ap ...
随机推荐
- cf965e Short Code
ref #include <algorithm> #include <iostream> #include <cstring> #include <cstdi ...
- Robotium测试报告的生成方法(下)
7.4 测试报告优化 通过上面的三种方法,我们都可以得到一个Xml格式的测试报告,不过这不是我们想要的,因为这样的报告读起来很费劲,而且这样的报告发给领导们也是不行的.所以我们要美化一下才行,一般都是 ...
- Python-S9-Day127-Scrapy爬虫框架2
01 今日内容概要 02 内容回顾:爬虫 03 内容回顾:并发和网络 04 Scrapy框架:起始请求定制 05 Scrapy框架:深度和优先级 06 Scrapy框架:内置代理 07 Scrapy框 ...
- Recommender System
推荐系统我们都很熟悉,淘宝推荐用户可能感兴趣的产品,搜索引擎帮助用户发现可能感兴趣的东西,这些都是推荐系统的内容.接下来讲述一个电影推荐的项目. Netflix 电影推荐系统 这个项目是使用的Netf ...
- Leetcode 514.自由之路
自由之路 视频游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring"的金属表盘,并使用表盘拼写特定关键词 ...
- rm 、git rm 、git rm --cached的区别
rm 删除文件 git rm git rm 当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用git rm git rm file = rm file+ git add f ...
- idea热部署设置(复制)
提出问题 IntelliJ IDEA工具如何设置热部署??? 解决问题 我的IDEA的版本是:IntelliJ IDEA 14.0.2 第一步:打开tomcat配置 这里写图片描述 第二步: 这里写图 ...
- NetScaler通过DHCP服务器获取IP地址
NetScaler通过DHCP服务器获取IP地址 DHCP 选项参考 https://www.iana.org/assignments/bootp-dhcp-parameters/bootp-dhcp ...
- import组件的时候报错
去webpack.base.js配置 resolve: { extensions: ['.js', '.vue', '.json'], alias: { 'vue$': 'vue/dist/vue.e ...
- svg动画 之 我的自制太阳系
SVG意为可缩放矢量图形,svg的图片与普通的jpg,png等图片相比,其优势在于不失真.一般普通的图片放大后,会呈现出锯齿的形状,但是svg图片则不会这样,它可以被高质量地打印. 现在就用dream ...