どのように私はトラック/部分グラフ内のすべての変更を観察することができますか?

StackOverflow https://stackoverflow.com/questions/2463950

質問

私は、いくつかの他のコンテナであることを、このようなNSManagedObjectsのサブクラスの数を持っているNSManagedObjectContextを持っています。私は何をしたいことは、その性質、団体、またはプロパティのいずれかに変更が通知されるように、トップレベルのオブジェクト見ている/それが含まれているオブジェクトのいずれかの団体ます。

コンテキストの「hasChanges」を使用して私に十分な精度を与えるものではありません。オブジェクトの更新される 'メソッドは、指定されたオブジェクトのみ(とないその団体で何か)に適用されます。そこにある便利な、私は部分グラフに限られている状況の変化を観察することができました(おそらく、KVOベース)?

役に立ちましたか?

解決

あなたは、データモデルに対するすべての変更をピックアップする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
}
あなたが見ることができるように

、通知は、オブジェクトが、更新、削除、および挿入された管理されている情報が含まれています。その情報から、あなたのデータモデルの変更に応じて行動することができる必要があります。

他のヒント

ここスウィフトでは簡単な例です。

    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)")
        }
    }

私にとって、もしかしたら、これが誰かのために時間を節約する、2 FUNC以下失った。

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

func controllerDidChangeContent(controller: NSFetchedResultsController) {
    tableView.endUpdates()
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top