介绍
多线程是为了不影响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里。