为什么在 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"]
这里的关键原因是 SDWebImageDownloaderOperation
是 NSOperation
的子 class 而这个 class 不适用于正常的 KVO
通知所有其他 classes。
这个操作在后台执行一些任务,所以你需要在你的操作完成时通知操作系统,什么时候仍然是 运行.
Apple 建议 here 显式调用 willChangeValueForKey
和 didChangeValueForKey
。
如果您正在寻找更好的解释为什么 NSOPerations
没有正常的 KVO,您可以阅读这个答案 Why does NSOperation disable automatic key-value observing?
有一个名为"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"]
这里的关键原因是 SDWebImageDownloaderOperation
是 NSOperation
的子 class 而这个 class 不适用于正常的 KVO
通知所有其他 classes。
这个操作在后台执行一些任务,所以你需要在你的操作完成时通知操作系统,什么时候仍然是 运行.
Apple 建议 here 显式调用 willChangeValueForKey
和 didChangeValueForKey
。
如果您正在寻找更好的解释为什么 NSOPerations
没有正常的 KVO,您可以阅读这个答案 Why does NSOperation disable automatic key-value observing?