0

I持って、次のcoredataエンティティへの変更を検出します。私のビューコントローラの1つでは、すべての部品を含む車のビューを表示します。私は車の部品の変更を聞きたい。単一のエンティティcoredata

私はこれがKVOで十分に簡単だと思いました。その後、

- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    [self.car addObserver:self forKeyPath:@"parts" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:nil]; 
} 

:私はすべての部品を変更しない場合でも

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if ([@"parts" isEqualToString:keyPath]) { 
     // do what I need to do with new parts 
    } 
} 

は、しかし、私は私がobserveValueForKeyPathメソッドに予想外のコールバックを取得しています車の部品を更新するために、サーバから変更をプルする場合。フォルトあれば疑問に思う

は問題がある可能性があります: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/FaultingandUniquing.html#//apple_ref/doc/uid/TP40001075-CH18-SW7

はKVOを使用することを望んで、多分coredataとそのだけではない素晴らしいアイデアをオブジェクトでした。私は間違ったことをやっているのですか?

KVOを使用すべきでない場合は、私の他の選択肢は次の通りです: 1. MOCの変更を聞きます。私は実際にオブジェクト上で何が変わったのか分からないので、これは素晴らしいことではありません。 2.私が興味を持っている車だけを見つけるために、述語を持つパーツにFetchedResultsControllerを実装します。ちょっと不安なようですが、これが私に必要なものを与えるでしょう。

答えて

0

NSFetchedResultsControllerは、一部のデータサブセットの変更を観察するのに適した方法です。

単一オブジェクトの場合、変更はNSManagedObjectContextで確認できます。

NSManagedObjectContextObjectsDidChangeNotification登録:

[[NSNotificationCenter defaultCenter] 
    addObserver:self 
     selector:@selector(contextDidChange:) 
      name:NSManagedObjectContextObjectsDidChangeNotification 
     object:context]; 

通知は、プロセスそのuserInfo到着すると:関連Partsが更新されたときにCarオブジェクトに関する通知を受信するには

- (void)contextDidChange:(NSNotification *)notification 
{ 
    NSManagedObjectContext *context = notification.object; 
    NSDictionary *userInfo = notification.userInfo; 

    NSArray *invalidatedAll = userInfo[NSInvalidatedAllObjectsKey]; 
    NSSet *invalidated  = userInfo[NSInvalidatedObjectsKey]; 
    NSSet *deleted   = userInfo[NSDeletedObjectsKey]; 
    NSSet *updated   = userInfo[NSUpdatedObjectsKey]; 
    NSSet *refreshed  = userInfo[NSRefreshedObjectsKey]; 

    // context reset 
    if (invalidatedAll) { 
     // probably you better have to dismiss your VC here. 
     return; 
    } 

    // invalidated 
    if ([invalidated containsObject:self.car]) { 
     // it make sense to dismiss here too. 
     return; 
    } 

    // deleted 
    if ([deleted containsObject:self.car]) { 
     // and here. 
     return; 
    } 

    // refreshed 
    if ([refreshed containsObject:self.car]) { 
     // update your interface. 
     return; 
    } 

    // updated 
    if ([updated containsObject:self.car]) { 
     // update your interface. 
     return; 
    } 
} 

を、このanswerを参照してください。

変更された属性のリストはchangedValuesプロパティから取得できます。

は退会することを忘れないでください:

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] 
     removeObserver:self 
        name:NSManagedObjectContextObjectsDidChangeNotification 
       object:context]; 
} 
関連する問題