我有一个方法可以添加观察者:
- (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
中使用?
P.S。我希望KVO能够在DISPATCH_QUEUE_PRIORITY_HIGH中工作。
编辑:
我观察AVPlayer变量。如:
[currentPlayer addObserver:self forKeyPath:@"currentItem.loadedTimeRanges" options:NSKeyValueObservingOptionNew context:kTimeRangesKVO];
这些变量会自动更改。
每次调用“observeValueForKeyPath”时,我都会检查队列,它仍然是dispatch_get_main_queue()
,我不知道如何将其更改为其他队列。
答案 0 :(得分:4)
作为观察者,您无法控制调用哪个线程/队列observeValueForKeyPath。您可以将调度包装到您希望围绕此方法执行的工作的队列中。这将把观察的工作转移到高优先级队列。
请确保您知道此工作可能在与触发观察的代码不同的线程/队列上运行。如果您正在观察的对象不是线程安全的,则需要在将其余工作分派到不同的队列之前进行检查。
答案 1 :(得分:3)
不,如果您希望以更高的优先级执行observeValueForKeyPath方法,则必须从具有更高优先级的线程更改键值.KVO同步工作,因此observeValueForKeyPath方法在您更改的同一线程上执行关键价值。