[英]NSOperation completionBlock is called twice
我正在研究一個NSOperation子類,我遇到了這個非常奇怪的問題,連續兩次調用完成塊。 KVO調用似乎很好但是completionBlock仍然被奇怪地調用了兩次。 我誤解了NSOperation嗎? 文檔說當isFinished
變為YES
並且只在我的代碼中發生一次時調用完成塊:
- (void)main {
@autoreleasepool {
[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isReady"];
executing = YES;
[self didChangeValueForKey:@"isReady"];
[self didChangeValueForKey:@"isExecuting"];
//start the operation
}
}
然后我只需像這樣設置completionBlock
:
self.completionBlock = ^{
NSLog(@"Completed");
}
當它完成時,這個方法被調用(它被稱為ONCE,我仔細檢查過)
- (void)completeOperation {
[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
executing = NO;
completed = YES;
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
}
但是,completionBlock被調用兩次並在控制台中兩次打印“Completed”。
以下是指示當前狀態的方法:
- (BOOL)isReady {
if (executing || cancelled || completed) {
return NO;
}
return YES;
}
- (BOOL)isCancelled {
return cancelled;
}
- (BOOL)isConcurrent {
return YES;
}
- (BOOL)isExecuting {
return executing;
}
- (BOOL)isFinished {
return completed;
}
isCancelled
在我的測試代碼中永遠不會變為YES
,因此不能成為它的原因。
我真的不明白為什么completeBlock被調用兩次。 即使從完成塊內部將完成塊設置為nil,有時也會調用兩次,這甚至更奇怪。
不確定這是否是原因,但根據我的經驗,不需要覆蓋只讀狀態屬性。 你負責在主循環中定期檢查isCancelled,如果它被設置為你正在做的任何事情,但我相信其他狀態標志(isReady,isFinished,isExecuting)會自動處理。
如果您剝離狀態標志處理並且只是在-main
處理,它會觸發多少次?
編輯:假設您重寫這些標志以允許並發,那么您應該閱讀文檔中的注釋
根據它的外觀,您永遠不需要覆蓋isReady
或isCancelled
,而是根據文檔中的說明覆蓋-start
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.