標籤:多線程 nsoperation
NSOperation
NSOperation封裝了GCD的一些操作,使用更加物件導向的方式實現多線程
建立多線程的步驟
- 先將需要執行的操作封裝到一個NSOperation對象中
- 然後將NSOperation對象添加到NSOperationQueue中
- 系統會自動將NSOperationQueue中的NSOperation取出來
NSOperation是個抽象類別,並不具備封裝操作的能力,必須使用它的子類
- NSInvocationOperation
- NSBlockOperation
- 自訂子類繼承NSOperation,實現內部相應的方法
NSOperation可以調用start方法來執行任務,但預設是同步執行的
如果將NSOperation添加到NSOperationQueue(操作隊列)中,系統會自動非同步執行NSOperation中的操作
NSInvocationOperation建立多線程不使用隊列
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];//啟動一個線程對象,預設調用run方法[operation1 start];//線程啟動,沒有這一句,線程不會啟動//預設情況下,調用了start方法後並不會開一條新線程去執行操作,而是在當前線程同步執行操作//只有將NSOperation放到一個NSOperationQueue中,才會非同步執行操作
使用隊列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //建立一個隊列對象 NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];//建立一個操作[queue addOperation:operation1];//把操作加到隊列中,自動開啟一個新線程執行[queue addOperationWithBlock:^{ NSLog(@"1----%@-----", [NSThread currentThread]); }];//在隊列中又添加一個操作
NSBlockOperation建立多線程
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"1----%@-----", [NSThread currentThread]); }];//第一個操作,不會新開一個線程線程[operation2 addExecutionBlock:^{ NSLog(@"2-----%@-----", [NSThread currentThread]); }];//添加操作,第二個操作,會開啟一個線程[operation2 start];//啟動線程//只要NSBlockOperation封裝的運算元 > 1,就會非同步執行操作
使用隊列建立多線程
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"1----%@-----", [NSThread currentThread]);}];[operation2 addExecutionBlock:^{ NSLog(@"2-----%@-----", [NSThread currentThread]);}]; [queue addOperation:operation2];
線程的其他動作設定優先權
設定NSOperation在queue中的優先順序,可以改變操作的執行優先順序- (NSOperationQueuePriority)queuePriority;- (void)setQueuePriority:(NSOperationQueuePriority)p
操作依賴
[operationB addDependency:operationA]; // 操作B依賴於操作A,必須A完成,才能執行B
操作監聽
//可以監聽一個操作的執行完畢- (void (^)(void))completionBlock;- (void)setCompletionBlock:(void (^)(void))block;
//opoeration操作完成後想要做什麼事 operation.completionBlock = ^{ NSLog(@"NSBlockOperation------上衣脫完了,脫褲子---%@", [NSThread currentThread]); };
【iOS開發-多線程】使用NSOperation建立線程(使用較多)