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に関する処理
}