3

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

- (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

PS 我希望 KVO 在 DISPATCH_QUEUE_PRIORITY_HIGH 中工作。

编辑:

我观察 AVPlayer 变量。如:

[currentPlayer addObserver:self forKeyPath:@"currentItem.loadedTimeRanges" options:NSKeyValueObservingOptionNew context:kTimeRangesKVO];

这些变量会自动更改。

每次调用“observeValueForKeyPath”时,我都会检查队列,它仍然存在dispatch_get_main_queue(),我不知道如何将其更改为其他队列。

4

2 回答 2

4

作为观察者,您无法控制从哪个线程/队列调用 observeValueForKeyPath。您可以围绕此方法所做的工作将调度包装到您希望的队列中。这会将观察的工作移至高优先级队列。

请确保您知道这项工作可能在与触发观察的代码不同的线程/队列上运行。如果您正在观察的对象不是线程安全的,您将需要在将其余工作分派到不同的队列之前对其进行检查。

于 2012-12-19T14:29:50.933 回答
3

不,如果您希望以更高的优先级执行 observeValueForKeyPath 方法,则必须从具有更高优先级的线程更改键值。KVO 同步工作,因此 observeValueForKeyPath 方法在更改键值的同一线程上执行.

于 2012-12-19T05:00:15.650 回答