我有一个Cocoa应用程序,可以监听通知并将更新发布到由NSMutableArray
监控的NSCollectionView
。通知以大量形式到达,因此我想使用不同的队列来处理它们并相应地更新阵列。
现在我正在使用addObserverForName:object:queue:usingBlock
注册通知,当我为队列指定NSCollectionView
时,它工作正常(数组和[NSOperationQueue mainQueue]
都已更新)。但是,当我创建自己的队列(使用[[NSOperationQueue alloc] init]
)时,NSCollectionView
停止更新。使用调试器我可以看到它正在监视的数组正在更新。
这是一个错误,还是我错过了什么?
答案 0 :(得分:3)
使用AppKit绑定时,任何发布的KVO通知都需要在主线程上发生才能使事情正常工作。因此,如果直接从后台线程中的通知处理程序修改数组,NSCollectionView将在该线程上接收任何触发的KVO通知,而不是主线程。发生这种情况时的行为是未定义的,最多不会起作用,而最坏的情况可能会导致崩溃或其他奇怪的行为。
如果通知的数量足够大,以至于每次通知的更新都是性能问题,我建议使用以下两种方法之一:
-[NSOperationQueue addOperationWithBlock:]
是一种简单的方法。