Objective c 大中央调度(GCD)和#x2B;键值观测(KVO)

Objective c 大中央调度(GCD)和#x2B;键值观测(KVO),objective-c,ios,xcode,grand-central-dispatch,key-value-observing,Objective C,Ios,Xcode,Grand Central Dispatch,Key Value Observing,我有一种添加观察者的方法: - (void) method { [currentPlayer addObserver:self forKeyPath:@"some" options:some context:some]; } 所有更改均采用以下方法处理: - (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *

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

- (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…
将在
调度队列优先级高的情况下工作

另外,我希望KVO在调度队列优先级高的情况下工作

编辑:

我观察AVPlayer变量。例如:

[currentPlayer addObserver:self forKeyPath:@"currentItem.loadedTimeRanges" options:NSKeyValueObservingOptionNew context:kTimeRangesKVO];
这些变量会自动更改


每次调用“observeValueForKeyPath”时,我都会检查队列,它仍然是
dispatch\u get\u main\u queue()
,我不知道如何将其更改为其他队列。

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

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


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

但我不会更改键值。我只是一个观察者,有些东西改变了键的值。KVO通知是在运行某物的任何线程或队列上发送的。我已尝试使其在所需队列上运行,但未成功。在这种情况下,您应该直接使用通知。为了提供快速了解:当您安装key-value observer时,运行库将现有的setter方法替换为一个为观察者调用“will change”的方法,调用旧的setter,然后为观察者调用“did change”。所以你得到了完全相同的效果,就好像是叫二传手的人也叫观察家一样。运行时并没有像调试器一样捕获任何东西,而是默默地切换方法实现。