大中央调度 (GCD) + 键值观察 (KVO)



我有一个添加观察者的方法:

- (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 方法在您更改键值的同一线程上执行。

最新更新