ios多線程操作(十一)—— NSOperation的進階操作

來源:互聯網
上載者:User

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");


執行效果如下:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.