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");
執行效果如下: