LoginSignup
26
23

More than 5 years have passed since last update.

KVO (Key-Value Observing, キー値監視) の受信処理がメインスレッドで処理されるのを保証する

Last updated at Posted at 2012-10-26

Viewもしくは、View Controllerでは、UIKitに対する処理を扱うため、メインスレッドでの処理が求められる場合が多いです。

KVOの受信処理が行なわれるスレッドは、通知処理が行なわれたスレッドに依存します。Viewもしくは、View Controller内では、KVOの受信処理がメインスレッドで処理されるのを保証するのが安全であると考えられます。

※参考:UIKit とスレッドのお約束 (フェンリル | デベロッパーズブログ)

メインスレッド以外からの通知を受けた場合、GCDを利用してメインスレッドで処理するように再度メッセージを呼ぶのが良いでしょう。

以下はGCDを利用した受信処理の記述例です。

KVO_ForViewOrViewController.m
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (![NSThread isMainThread]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self observeValueForKeyPath:keyPath ofObject:object change:change context:context];
        });

        return;
    }

    // KVOに関する処理
}
26
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
23