亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

NSOperationQueue完成所有任務時獲取通知

NSOperationQueue完成所有任務時獲取通知

蕪湖不蕪 2019-12-09 13:14:42
NSOperationQueue具有waitUntilAllOperationsAreFinished,但我不想同步等待它。我只想在隊列完成時在UI中隱藏進度指示器。做到這一點的最佳方法是什么?我無法從NSOperations 發送通知,因為我不知道哪個將是最后一個,并且[queue operations]在收到通知時可能還不為空(或者更糟-已重新填充)。
查看完整描述

3 回答

?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

使用KVO觀察operations隊列的屬性,然后通過檢查可以判斷隊列是否已完成[queue.operations count] == 0。


在您正在執行KVO的文件中的某處,像這樣聲明KVO的上下文(更多信息):


static NSString *kQueueOperationsChanged = @"kQueueOperationsChanged";

設置隊列時,請執行以下操作:


[self.queue addObserver:self forKeyPath:@"operations" options:0 context:&kQueueOperationsChanged];

然后在您的observeValueForKeyPath:


- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 

                         change:(NSDictionary *)change context:(void *)context

{

    if (object == self.queue && [keyPath isEqualToString:@"operations"] && context == &kQueueOperationsChanged) {

        if ([self.queue.operations count] == 0) {

            // Do something here when your queue has completed

            NSLog(@"queue has completed");

        }

    }

    else {

        [super observeValueForKeyPath:keyPath ofObject:object 

                               change:change context:context];

    }

}

(這是假設您NSOperationQueue位于名為的屬性中queue)


在對象完全解除分配之前(或當它停止關心隊列狀態時),在某些時候,您需要像這樣從KVO注銷:


[self.queue removeObserver:self forKeyPath:@"operations" context:&kQueueOperationsChanged];



附錄:iOS 4.0具有一個NSOperationQueue.operationCount屬性,根據文檔,該屬性符合KVO。但是,此答案在iOS 4.0中仍然有效,因此對于向后兼容仍然有用。


查看完整回答
反對 回復 2019-12-09
  • 3 回答
  • 0 關注
  • 1468 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號