我有一个添加观察者的方法:
- (void) method
{
[currentPlayer addObserver:self forKeyPath:@"some" options:some context:some];
}
所有更改都通过以下方法进行处理:
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
如果我将我的方法修改为:
- (void) method
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
[currentPlayer addObserver:self forKeyPath:@"some" options:some context:some];
});
}
这是否意味着- (void) observeValueForKeyPath...
将在DISPATCH_QUEUE_PRIORITY_HIGH
工作?
附言我希望KVO在DISPATCH_QUEUE_PRIORITY_HIGH工作。
编辑:
我观察AVPlayer变量。如:
[currentPlayer addObserver:self forKeyPath:@"currentItem.loadedTimeRanges" options:NSKeyValueObservingOptionNew context:kTimeRangesKVO];
这些变量会自动更改。
每次调用"observeValueForKeyPath"时,我都会检查队列,它仍然dispatch_get_main_queue()
,我不知道如何将其更改为其他队列。
作为观察者,您无法控制从哪个线程/队列 observeValueForKeyPath 调用。 您可以将调度包装到您希望的队列中,围绕此方法所做的工作。 这会将观察工作移至高优先级队列。
只要确保您知道这项工作可能运行在与触发观察的代码不同的线程/队列上即可。 如果您观察到的对象不是线程安全的,则需要在将其余工作分派到其他队列之前对其进行检查。
不,如果您希望 observeValueForKeyPath 方法以更高的优先级执行,则必须更改具有更高优先级的线程的键值。KVO 同步工作,因此 observeValueForKeyPath 方法在您更改键值的同一线程上执行。