多线程 -- NSOperation
2016-03-01 本文已影响39人
嘻嘻zhy
介绍
多线程是为了不影响UI响应
封装后可以避免重复代码
NSOperationQueue:封装线程管理部分
NSOperation:封装任务部分
- NSInvocationOperation:selector编写任务
- NSBlockOperation:block编写任务
- 任务可以用依赖关系串起来
NSOperation抽象基类
提供了接口。
-
执行
- start
- 设置状态调用main
- cancel
- waitUntilFinished
-
任务定义
-
main
-
默认不做事
-
会在NSOperation提供的AutoRealeasePool中执行
-
定义NSOperation 子类时覆盖
NSInvocationOperation
创建
- initWithTarget selector object
- initWithInvocation
- (void)viewDidLoad {
[super viewDidLoad];
NSOperation *no = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(say1) object:nil];
[no start];
}
- (void) say1{
for (int i=0; i<10; i++) {
NSLog(@"%d",i);
}
}
NSBlockOperation
创建
blockOperationWithBlock
NSOperation *bo = [NSBlockOperation blockOperationWithBlock:^{
for (int i=0; i<10; i++) {
NSLog(@"%d",i);
}
} ];
追加新的Block
addExecutionBlock
[bo addExecutionBlock:^{
NSLog(@"addExe");
}];
这里需要注意一点,block本来是储存在栈上的,在加入NSBlockOperation后会对block进行copy,使它们存放在堆上。这时候再对原有的block进行修改也不会有影响。
void (^xixi)(void) = ^(){
NSLog(@"first");
};
NSBlockOperation *bo = [NSBlockOperation blockOperationWithBlock:xixi];
xixi = ^(){
NSLog(@"second");
};
[bo addExecutionBlock:xixi];
[bo start];
NSOperation依赖关系
addDependency:dep
dep结束后 才执行
注意不要循环依赖
NSOperation 状态
.name
.ready
.asynchronous
setCompletionBlock
执行后置为nil
NSOperationQueue
Queue operations
alloc init 或者 new 创建
-
add
-
addOperation
-
addOperations
-
addOperationWithBlock(省略创建,但是不能管理dependency)
-
exec control
-
setMaxConcurrentOperationCount
-
addDependency
-
cancelAllOperation
-
setSuspended
-
waitUntilAlloperationAreFinished
如果Dep所在队列堵塞,本身所在的queue也会堵塞。
最安全是dep都在一个queue里。