NSOperation 是一個(gè)抽象基類,使用的話最多的是系統(tǒng)封裝好的兩個(gè)類
- NSInvocationOperation
- NSBlockOperation
NSOperation必須配合NSOperationQueue使用,否則沒毛用。在自定義隊(duì)列中兩者都是異步執(zhí)行,且都在子線程執(zhí)行。block內(nèi)部同步執(zhí)行。
基本用法
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; //主隊(duì)列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //自定義隊(duì)列
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
//任務(wù)執(zhí)行
}];
[queue addOperation:operation];
//可以設(shè)置maxConcurrentOperationCount 最大線程數(shù),為1則成為一個(gè)串行隊(duì)列
實(shí)例
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"----");
//1.創(chuàng)建隊(duì)列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//2.封裝操作
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
sleep(3);
NSLog(@"這是第一次%@",[ NSThread currentThread]);
}];
//3.封裝操作
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
sleep(4);
NSLog(@"這是第二次%@",[ NSThread currentThread]);
}];
//4.合成數(shù)據(jù)
NSBlockOperation *combine = [NSBlockOperation blockOperationWithBlock:^{
sleep(5);
//7.回到主線程刷新UI
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
NSLog(@"刷新UI---%@",[NSThread currentThread]);
}];
}];
//5.設(shè)置操作依賴
[combine addDependency:op1];
[combine addDependency:op2];
//6.添加操作到隊(duì)列中執(zhí)行
//可跨隊(duì)列創(chuàng)建依賴
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:combine];
//或
[queue addOperations:[op1,op2,combine] waitUntilFinished:NO];
//Bool參數(shù)表示當(dāng)前線程是否等待所有任務(wù)完成再返回。
}