为什么在 SDWebImage 中使用 "willChangeValueForKey:"?

why use "willChangeValueForKey:" in SDWebImage?

有一个名为"SDWebImageDownloaderOperation"的class,在SDWebImageView lib中有以下方法。

- (void)setFinished:(BOOL)finished {
    [self willChangeValueForKey:@"isFinished"];
    _finished = finished;
    [self didChangeValueForKey:@"isFinished"];
}

但是rs并没有覆盖automaticallyNotifiesObserversForKey:,也没有实现observeValueForKeyPath:ofObject:change:context:方法,那么写

的目的是什么
[self willChangeValueForKey:@"isFinished"]

 [self didChangeValueForKey:@"isFinished"]

这里的关键原因是 SDWebImageDownloaderOperationNSOperation 的子 class 而这个 class 不适用于正常的 KVO 通知所有其他 classes。 这个操作在后台执行一些任务,所以你需要在你的操作完成时通知操作系统,什么时候仍然是 运行.

Apple 建议 here 显式调用 willChangeValueForKeydidChangeValueForKey

如果您正在寻找更好的解释为什么 NSOPerations 没有正常的 KVO,您可以阅读这个答案 Why does NSOperation disable automatic key-value observing?