كيف يمكنني تعقب / مراقبة جميع التغييرات ضمن رسم بياني ثانوي؟

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

سؤال

ولدي 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()
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top