簡體   English   中英

NSOperation completionBlock被調用兩次

[英]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處理,它會觸發多少次?

編輯:假設您重寫這些標志以允許並發,那么您應該閱讀文檔中的注釋

根據它的外觀,您永遠不需要覆蓋isReadyisCancelled ,而是根據文檔中的說明覆蓋-start

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM