58

NSManagedObjectContextがあり、NSManagedObjectsのサブクラスがいくつかあり、一部は他のコンテナになっています。私がやりたいのは、最上位のオブジェクトを監視して、そのプロパティ、関連付け、またはオブジェクトに含まれるオブジェクトのプロパティ/関連付けの変更が通知されるようにすることです。

コンテキストの「hasChanges」を使用しても、十分な粒度が得られません。オブジェクトの「isUpdated」メソッドは、指定されたオブジェクトにのみ適用されます(その関連付けには何も適用されません)。サブグラフに限定されたコンテキストで変化を観察できる便利な(おそらくKVOベースの)ものはありますか?

4

3 に答える 3

129

NSManagedObjectContextObjectsDidChangeNotificationがデータ モデルへのすべての変更を取得するのをリッスンする必要があります。これは、次のようなコードを使用して実行できます。

[[NSNotificationCenter defaultCenter] 
      addObserver:self 
         selector:@selector(handleDataModelChange:) 
             name:NSManagedObjectContextObjectsDidChangeNotification 
           object:myManagedObjectContext];

-handleDataModelChange:これは、コンテキストが変更されたときにトリガーされmyManagedObjectContextます。

:メソッド-handleModelDataChangeは次のようになります。

- (void)handleDataModelChange:(NSNotification *)note
{
    NSSet *updatedObjects = [[note userInfo] objectForKey:NSUpdatedObjectsKey];
    NSSet *deletedObjects = [[note userInfo] objectForKey:NSDeletedObjectsKey];
    NSSet *insertedObjects = [[note userInfo] objectForKey:NSInsertedObjectsKey];

    // Do something in response to this
}

ご覧のとおり、通知には、どの管理対象オブジェクトが更新、削除、および挿入されたかに関する情報が含まれています。その情報から、データ モデルの変更に応じて対応できるはずです。

于 2010-03-18T13:21:27.610 に答える
19

Swift での簡単な例を次に示します。

    NotificationCenter.default.addObserver(forName: .NSManagedObjectContextObjectsDidChange, object: nil, queue: nil) { note in
        if let updated = note.userInfo?[NSUpdatedObjectsKey] as? Set<NSManagedObject>, updated.count > 0 {
            print("updated: \(updated)")
        }

        if let deleted = note.userInfo?[NSDeletedObjectsKey] as? Set<NSManagedObject>, deleted.count > 0 {
            print("deleted: \(deleted)")
        }

        if let inserted = note.userInfo?[NSInsertedObjectsKey] as? Set<NSManagedObject>, inserted.count > 0 {
            print("inserted: \(inserted)")
        }
    }
于 2015-11-20T02:20:27.290 に答える
0

私にとっては、2つの機能に続いて失われただけです。おそらく、これで誰かの時間を節約できます

func controllerWillChangeContent(controller: NSFetchedResultsController) {
    tableView.beginUpdates()
}

func controllerDidChangeContent(controller: NSFetchedResultsController) {
    tableView.endUpdates()
}
于 2016-09-01T14:24:58.573 に答える