1.NSOperation 和 GCD的关系
两者同为IOS 和 OS X 中的多线程操作API .
GCD 是基于C 底层的API,NSOperation是基于GCD的。
2.优先使用NSOPerationQueue
虽然NSOperation是基于GCD的,但并不代表他是一个低级版。
相反请看CGD坑一:
dispatch_async(_Queue, ^{
//请求数据
NSData *data = [NSData dataWithContentURL:[NSURL URLWithString:@"http://domain.com/a.png"]];
dispatch_async(dispatch_get_main_queue(), ^{
[self refreshViews:data];
});
});
这个任务是无法取消的 dataWithContentURL:
是同步的拉取数据,它会一直阻塞线程直到完成请求,如果是遇到了超时的情况,它在这个时间内会一直占有这个线程;在这个期间并发队列就需要为其他任务新建线程,这样可能导致性能下降等问题。
因此我们不推荐这种写法来从网络拉取数据。
操作队列(operation queue)是由 GCD 提供的一个队列模型的 Cocoa 抽象。GCD 提供了更加底层的控制,而操作队列则在 GCD 之上实现了一些方便的功能,这些功能对于 app 的开发者来说通常是最好最安全的选择。NSOperationQueue相对于GCD来说有以下优点:
- 提供了在 GCD 中不那么容易复制的有用特性。
- 可以很方便的取消一个NSOperation的执行
- 可以更容易的添加任务的依赖关系
- 提供了任务的状态:isExecuteing, isFinished.
3.Operation Quenes的使用
NSOperationQueue 有两种不同类型的队列,主队列和自定义队列。主队列运行在主线程之上,而自定义线程运行在后台。在两种类型中,这些队列所处理的任务都使用 NSOperation
的子类来表述。
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; //主队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //自定义队列
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
//任务执行
}];
[queue addOperation:operation];
我们可以通过设置
maxConcurrentOperationCount
属性来控制并发任务的数量,当设置为
1
时, 那么它就是一个串行队列。主对列默认是串行队列,这一点和
dispatch_queue_t
是相似的。
4.NSOperation
5.Runloop
在cocoa中讲到多线程,那么就不得不讲到RunLoop。 在ios/mac的编码中,我们似乎不需要过多关心代码是如何执行的,一切仿佛那么自然。比如我们知道当滑动手势时,tableView就会滚动,启动一个NSTimer之后,timer的方法就会定时执行, 但是为什么呢,其实是RunLoop在帮我们做这些事情:分发消息。
你应该看过这样的伪代码解释ios的app中main函数做的事情:
1 2 3 4 5 6 | |
也应该看过这样的代码用来阻塞一个线程:
1 2 3 | |
或许你感觉到他们有些神奇,希望我的解释能让你明白一些.
我们先思考一个问题: 当我们打开一个IOS应用之后,什么也不做,这时候看起来是没有代码在执行的,为什么应用没有退出呢?
我们在写c的简单的只有一个main函数的程序时就知道,当main的代码执行完,没有事情可做的时候,程序就执行完毕退出了。而我们IOS的应用是如何做到在没有事情做的时候维持应用的运行的呢? 那就是RunLoop。
RunLoop的字面意思就是“运行回路”,听起来像是一个循环。实际它就是一个循环,它在循环监听着事件源,把消息分发给线程来执行。RunLoop并不是线程,也不是并发机制,但是它在线程中的作用至关重要,它提供了一种异步执行代码的机制。
下面的没看懂 ,就不多写了,原文贴出来,想看的可以看看 点击打开链接