كيف يمكنني تعقب / مراقبة جميع التغييرات ضمن رسم بياني ثانوي؟
-
20-09-2019 - |
سؤال
ولدي NSManagedObjectContext التي لدي عدد من الفئات الفرعية من NSManagedObjects مثل أن بعضها حاويات للآخرين. ما أود القيام به هو مشاهدة كائن المستوى الأعلى ليتم إعلامك بأي تغييرات تطرأ على أي من خصائصه، والجمعيات، أو خصائص / جمعيات أي من الكائنات التي يحتوي عليها.
واستخدام 'hasChanges "في سياق لا تعطيني ما يكفي من التفاصيل. ينطبق 'isUpdated "طريقة الكائنات فقط إلى كائن معين (وليس أي شيء في الجمعيات الخاصة به). هناك مريحة (ربما، المنظمة من القائم) كان يمكنني مراقبة التغيرات في سياق أن تقتصر على رسم بياني ثانوي؟
المحلول
وسوف تريد ان تستمع ل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)")
}
}
وبالنسبة لي انها مجرد فقدت التاليين ظائفها، وربما هذا حفظ ساعات لشخص
func controllerWillChangeContent(controller: NSFetchedResultsController) {
tableView.beginUpdates()
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates()
}