ios多線程操作(十一)—— NSOperation的進階操作
NSOperation可以調用start方法來執行任務,但預設是同步執行的,如果將NSOperation添加到 NSOperationQueue(操作隊列)中,系統會自動非同步執行隊列中的操作。 NSOperationQueue中可以對操作進行取消,暫停和恢複 取消函數為:
- (void)cancelAllOperations;
也可以調用NSOperation的cancel方法來取消單個操作
- (void)cancel;
隊列中有個屬性 suspended ,通過設定該BOOL值的YES或NO來暫停和恢複操作。 操作也有優先順序,通過設定NSOperation在隊列中的優先順序,可以改變操作的執行優先順序,NSOperation中有個屬性queuePriority, 可以通過該屬性來設定,優先順序的取值都有 NSOperationQueuePriorityVeryLow = -8L, NSOperationQueuePriorityLow = -4L, NSOperationQueuePriorityNormal = 0, NSOperationQueuePriorityHigh = 4, NSOperationQueuePriorityVeryHigh = 8 NSOperation中具備一個非常常用的屬性,該屬性在標頭檔中得定義如下
@property (copy) void (^completionBlock)(void) NS_AVAILABLE(10_6, 4_0);
通過該屬性我們可以進行操作的監聽,當該操作執行完畢後,就會執行completionBlock中的塊代碼,例如:
// 建立一個塊操作 NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{ [NSThread sleepForTimeInterval:3.0]; NSLog(@"%@ , come here",[NSThread currentThread]); }]; // 建立一個操作隊列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 將操作添加到隊列 [queue addOperation:op]; // 監聽該操作,當完成該操作後執行的代碼 [op setCompletionBlock:^{ [[NSOperationQueue mainQueue] addOperationWithBlock:^{ NSLog(@"%@,here",[NSThread currentThread]); }]; }];
效果如下:
無論執行什麼操作,塊代碼總會在最後執行! NSoperation之間可以設定依賴來保證執行順序,例如:
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"使用者登入 %@", [NSThread currentThread]); }]; NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"付費 %@", [NSThread currentThread]); }]; NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{ [NSThread sleepForTimeInterval:1.0f]; NSLog(@"下載 %@", [NSThread currentThread]); }]; NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"更新UI %@", [NSThread currentThread]); }]; /* "指定任務之間的依賴關係" - GCD使用的同步任務(不會開線程) NSOperation 會開線程,但是依然能夠保證操作的執行順序,並發效率會更好! 依賴關係,是可以跨隊列的 */ // 付費之前需要登入 [op2 addDependency:op1]; // 下載之前需要付費 [op3 addDependency:op2]; // 更新UI之前需要完成下載 [op4 addDependency:op3]; // 注意:在指定依賴關係時,注意不要出現循環相依性 // waitUntilFinished == NO,非同步 YES 是同步的 [self.queue addOperations:@[op1, op2, op3] waitUntilFinished:NO]; // 更新UI的操作,應該由主隊列來調度 [[NSOperationQueue mainQueue] addOperation:op4]; NSLog(@"come here");
執行效果如下: