2017-10-12 3 views
0

기본적으로 한 시점에서 3 컨테이너가있는 masterView 컨트롤러가 있습니다. 예를 들어 NSManagedObject를 업데이트하고 있습니다. (Person.firstName = "Ehab")!두 개의 다른보기 컨트롤러에서 NSManagedObject 레코드의 변경을 관찰하는 방법?

다른 컨테이너에는 [Person] & 속성이 있고 다른 하나에는 [Person : String] & 속성이 있습니다. 이러한 컬렉션 속성에는 모두 변경된 레코드가 있습니다.

내가 (Person.firstName = "taylor")를 변경하면 다른 2 클래스가 필요하다는 것을 알았습니다. 배열 및 사전에 변경된 사항이 있는지 어떻게 알 수 있습니까?

한 가지 방법은 NotoficationCenter를 사용하고 UserInfo에서 수정 된 개체를 전달하는 것입니다. 그러나 그것을 할 수있는 더 쉬운 방법이 있습니까 ??

+0

프로토콜을 만드는 방법은 무엇입니까? 예를 들어, func person (_ didChange : Person)과 함께 ChangeDelegate를 호출하는 것입니다. 이 프로토콜을 사용하여 자체 위임하는 2 개의 다른 컨테이너 ... –

+0

좋은 생각은 아니지만 제 경우에는 알림이 더 좋다고 생각합니다. –

답변

0

는 가장 일반적인 방법과 가장 쉬운 방법은 NSManagedObjectContext의 변경에 대한 통지를하는 NSManagedObjectContextObjectsDidChangeNotification을 듣습니다. 삽입, 삭제 또는 케이스 업데이트 된 객체를 userInfo 사전에서 추출 할 수 있습니다.

그러나 NSManagedObjectContext이 저장하는 경우에만 알림을 받게됩니다.

분명히, 개체를 관리하고 이러한보기 컨트롤러에서 알림을 처리하려는 모든보기 컨트롤러에서이 알림에 등록해야합니다. 이 온라인 및 Apple docs/sample code에 대한 많은 문서가 있습니다.

+0

** 이것에 대해 제안하는 것은 ** NSManagedObjectContextObjectsDidChangeNotification **으로 수행 할 수 있다고 생각합니다! 그러나 NotificationCenter를 사용하는 것이 여전히 쉽고 읽기 쉽다고 생각합니다. 귀하의 회신에 감사드립니다! 고맙습니다. :) –

+0

물론 알림 센터에이 알림에 등록해야합니다. 문제 없어. – McNight

0

사용 NSManagedObjectContextObjectsDidChange 당신이 용기 viewDidLoad에서

, 관찰자에게이 도움이

override func viewDidLoad() { 
    super.viewDidLoad() 
    let notificationCenter = NotificationCenter.default 
    notificationCenter.addObserver(self, selector: #selector(managedObjectContextObjectsDidChange(_:)), name: Notification.Name.NSManagedObjectContextObjectsDidChange, object: yourManagedObjectContext) 


@objc func managedObjectContextObjectsDidChange(_ notification: Notification){ 
    guard let userInfo = notification.userInfo else { 
     return 
    } 

    if let updates = userInfo[NSUpdatedObjectsKey] as? Set<NSManagedObject> { 
     for update in updates { 
      if let person = update as? Person { 
       // update person info here 

      } 
     } 
    } 
} 

희망을 추가합니다.

+0

고마워요. .... 내가 한 일은 사용자 정의 알림을 설치하고 "mangedContext를 저장 한 후"업데이트 된 객체를 전달한 것입니다. 그 다음 나는 그것을 대체했다. 나는 그것이 내가 가진 것에 대한 더 나은 접근법일지도 모른다고 생각했다. :) –