본문 바로가기
프로그래밍 놀이터/iOS

[ios] NSManagedObjectContextDidSaveNotification sent in todayExtension?

by 돼지왕 왕돼지 2018. 2. 10.
반응형

[ios] NSManagedObjectContextDidSaveNotification sent in todayExtension?


참조 : https://www.innoq.com/en/blog/ios-writing-core-data-in-today-extension/

addObserver, array, COMMIT, CONTEXT, CoreData, flag, Foreground, main app, managedObjectContext, mergeChangesFromRemoteContextSave, NSManagedObjectContextDidSaveNotification, nsmanagedobjectdidsavenotification, NSManagedObjectID, NSURL, PersistanceStoreCoordinator, process, Reset, Sync, todayextension, UserDefault, userdefault group, [ios] NSManagedObjectContextDidSaveNotification sent in todayExtension?


-

context 를 여러 개 사용하는 경우에 context 에 대한 commit 분의 sync 를 맞춰주기 위해

CoreData 는 내부적으로 NSManagedObjectContextDidSaveNotification noti 를 보내고,

이를 addObserver 해놓은 곳에서는 mergeChangesFromRemoteContextSave 함수를 통해 sync 를 맞춘다.



-

그러나 todayExtension 에서 context 에 변화를 주었다고 해도,

Main app 에서는 process 가 다르기 때문에 ( 혹은 PersistanceStoreCoordinator 가 달라서? 내부구현은 알 수 없으니 ) 해당 Notification 을 받을 수 없다.



-

그럼 어떻게 해결하느냐?

UserDefault 에 어떤 Flag 를 설정해놓고(UserDefault Group 을 사용하면 앱과 todayExtension 이 공유 가능하다), Main App 이 Foreground 에 올라오는 순간 해당 flag 가 체크되어 있다면

ManagedObjectContext 를 reset 하는 방법이 있겠다.

그러나 이 방법은 reset 을 하는 순간에 이미 작업중이던 내용들이 날아갈 수 있으므로 ideal 한 solution 은 아니다.



-

그렇다면 변경분을 UserDefault 에 다 써 놓고,

Main App 이 Foreground 로 올라오는 순간 해당 내용을 일괄 반영해야 하는데...

쉽지 않아 보인다.



-

NSManagedObjectID 나 NSURL 의 array 형태를 mergeChangesFromRemoteContextSave 를 호출하며 전달해주면 해당 내용만 merge 시킬 수 있다.





반응형

댓글