你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> ios多線程操作(十一)—— NSOperation的高級操作

ios多線程操作(十一)—— NSOperation的高級操作

編輯:IOS開發綜合
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");


執行效果如下: \
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved