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 に答える