UFO ET IT

하위 그래프 내의 모든 변경 사항을 어떻게 추적 / 관찰 할 수 있습니까?

ufoet 2020. 12. 14. 20:24
반응형

하위 그래프 내의 모든 변경 사항을 어떻게 추적 / 관찰 할 수 있습니까?


일부 NSManagedObjects 하위 클래스가있는 NSManagedObjectContext가 있습니다. 내가하고 싶은 것은 최상위 개체가 포함 된 모든 개체의 속성, 연결 또는 속성 / 연결에 대한 변경 사항에 대한 알림을받는 것입니다.

컨텍스트의 'hasChanges'를 사용하면 충분한 세분성을 제공하지 않습니다. 개체 'isUpdated'메서드는 지정된 개체에만 적용됩니다 (연결에있는 항목은 적용되지 않음). 하위 그래프로 제한된 컨텍스트에서 변화를 관찰 할 수있는 편리한 (아마도 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
}

보시다시피 알림에는 어떤 관리 개체가 업데이트, 삭제 및 삽입되었는지에 대한 정보가 포함되어 있습니다. 이 정보에서 데이터 모델 변경에 대응할 수 있어야합니다.


다음은 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)")
        }
    }

나를 위해 그것은 두 가지 기능을 따라 잃어버린 것입니다.

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

func controllerDidChangeContent(controller: NSFetchedResultsController) {
    tableView.endUpdates()
}

참고 URL : https://stackoverflow.com/questions/2463950/how-can-i-track-observe-all-changes-within-a-subgraph

반응형