سياق البيانات الأساسية "القذرة": تطبيق MOC حفظ التطبيق
-
19-09-2019 - |
سؤال
جديد إلى حد ما إلى فون ديف. يستخدم تطبيقي البيانات الأساسية، وفي نقطة واحدة أحاول حفظ بعض البيانات أثناء طريقة nsfetchedresultscontrollerdlegate:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
أحصل على معظم هذا الحق من وثائق أبل حول هذا الموضوع. يشبه إجراء الحذف بذلك:
case NSFetchedResultsChangeDelete:
[managedObjectContext deleteObject:anObject];
NSError *error;
if (![managedObjectContext save:&error]) {
NSLog(@"WTF? %@", [error description]);
}
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
الآن، عند القيام بذلك، سيتم حذف الكائن المعني بعد التعطل الذي لا مفر منه. لذلك يحدث شيء صحيح. الحادث مثير للاهتمام، على الرغم من:
خطأ في تطبيق خطير. تم اكتشاف استثناء أثناء معالجة تغيير البيانات الأساسية: فشل في معالجة التغييرات المعلقة قبل الحفظ. السياق لا يزال قذرا بعد 100 محاولة. عادة ما يحدث هذا القذيق المتكرر بطريقة سيئة التحقق من الصحة أو -Willsave أو معالج الإعلام. مع userinfo (null)
2010-02-09 23: 02: 02: 02: 03.931 App2 [26664: 207] *** إنهاء التطبيق بسبب الاستثناء غير المدقق "NSINTERNALINCOSSISCOSEXICE '، السبب:' فشل في معالجة التغييرات المعلقة قبل الحفظ. السياق لا يزال قذرا بعد 100 محاولة. عادة ما يحدث هذا القذيق المتكرر من خلال طريقة التحقق السيئة أو -Willsave أو معالج الإعلام.
أصبح بحثي بعض النتائج المحدودة للغاية - شيء جيد لدي هنا لتوثيق هذا، إيه؟ :-) ولكن بلدي القناة الهادئة يقولون أن MOC مكتوبا إلى مكان آخر في جهاز التحكم الخاص بي، على الرغم من أنني لا أجد أي دليل على حدوث ذلك. تتمتع طريقة DIADIDLOAD في NSFetchedResultScontroller لاستخدامها للحصول على البيانات الأولية، ولكن هذا كل شيء.
أي اقتراحات حول ما قد يكون مخطئا هنا؟ كالعادة، فإن عقلك الخليه المجتمعي الخاص بك هو موضع تقدير كبير!
هتافات، هارون
المحلول
(إذا فهمت المشكلة بشكل صحيح) أعتقد أن كل ما عليك القيام به في هذه الحالة هو:
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
تذكر أن هذه الطريقة
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
يتم إعلامك بعد تغير البيانات الأساسية. لذلك أعتقد أن جسمك محذوف بالفعل، لا تحتاج إلى حذفه يدويا. كل ما تبقى له في هذه الطريقة يتم إزالته من الجدول ".
أتمنى أن يساعدك هذا!