介紹
多線程是為了不影響UI響應(yīng)
封裝后可以避免重復(fù)代碼
NSOperationQueue:封裝線程管理部分
NSOperation:封裝任務(wù)部分
- NSInvocationOperation:selector編寫任務(wù)
- NSBlockOperation:block編寫任務(wù)
- 任務(wù)可以用依賴關(guān)系串起來
NSOperation抽象基類
提供了接口。
-
執(zhí)行
- start
- 設(shè)置狀態(tài)調(diào)用main
- cancel
- waitUntilFinished
任務(wù)定義
main
默認(rèn)不做事
會(huì)在NSOperation提供的AutoRealeasePool中執(zhí)行
定義NSOperation 子類時(shí)覆蓋
NSInvocationOperation
創(chuàng)建
- 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
創(chuàng)建
blockOperationWithBlock
NSOperation *bo = [NSBlockOperation blockOperationWithBlock:^{
for (int i=0; i<10; i++) {
NSLog(@"%d",i);
}
} ];
追加新的Block
addExecutionBlock
[bo addExecutionBlock:^{
NSLog(@"addExe");
}];
這里需要注意一點(diǎn),block本來是儲(chǔ)存在棧上的,在加入NSBlockOperation后會(huì)對(duì)block進(jìn)行copy,使它們存放在堆上。這時(shí)候再對(duì)原有的block進(jìn)行修改也不會(huì)有影響。
void (^xixi)(void) = ^(){
NSLog(@"first");
};
NSBlockOperation *bo = [NSBlockOperation blockOperationWithBlock:xixi];
xixi = ^(){
NSLog(@"second");
};
[bo addExecutionBlock:xixi];
[bo start];
NSOperation依賴關(guān)系
addDependency:dep
dep結(jié)束后 才執(zhí)行
注意不要循環(huán)依賴
NSOperation 狀態(tài)
.name
.ready
.asynchronous
setCompletionBlock
執(zhí)行后置為nil
NSOperationQueue
Queue operations
alloc init 或者 new 創(chuàng)建
add
addOperation
addOperations
addOperationWithBlock(省略創(chuàng)建,但是不能管理dependency)
exec control
setMaxConcurrentOperationCount
addDependency
cancelAllOperation
setSuspended
waitUntilAlloperationAreFinished
如果Dep所在隊(duì)列堵塞,本身所在的queue也會(huì)堵塞。
最安全是dep都在一個(gè)queue里。