فشل عرض الجدول NSFetchedResultScontroller دائما في إدراج الكيان الثاني

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

سؤال

أنا أستخدم NSFetchedResultScontroller لإدارة عرض الكائنات المدارة المنفجرة في عرض جدول يحتوي على قسم واحد. يبدأ الجدول فارغا ويمكن للمستخدم إضافة كيانات جديدة إليها باستخدام UI. كما تقف، يعمل البرنامج دائما عند إضافة الكيان الأول، ويعطل دائما عند إضافة ثانية. لا يوجد في بعض الأحيان أي خطأ يتم تقديمه عند تعطل وأوقات أخرى هناك أخطاء من الأنواع المختلفة (بعضها المدرجة أدناه). من خلال بيانات السجل وتتبعها، أرى أن البرنامج يتعطل بعد التحكم في NSFetchResultScontroller الخاص ب NSFetchResultSController's Controllchangecontent (الذي يستدعي [Self.TableVeview BeginUpdates]؛) طريقة مخارج الأسلوب، ولكن قبل استدعاء أي طريقة أخرى في التعليمات البرمجية الخاصة بي. فيما يلي بعض الأجزاء النائية من التعليمات البرمجية الخاصة بي. تكوين nsfetchedresultscontroller:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Beer"
                                    inManagedObjectContext:self.managedObjectContext]];

// Configure request's entity and predicate
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptor release];
[sortDescriptors release];

NSString *expression = [NSString stringWithFormat:@"brewery.name LIKE \"%@\"", self.brewery.name];
NSPredicate *predicate = [NSPredicate predicateWithFormat:expression];
[fetchRequest setPredicate:predicate];
self.resultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                             managedObjectContext:self.managedObjectContext
                                                               sectionNameKeyPath:nil
                                                                        cacheName:nil];
self.resultsController.delegate = self;
[fetchRequest release];

NSError *error = nil;
BOOL success = [resultsController performFetch:&error];
if (!success) {
    NSLog(@"Error fetching request %@", [error localizedDescription]);
}

إضافة كيان جديد:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Beer" inManagedObjectContext:self.managedObjectContext];
Beer *beer = [[Beer alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];
beer.name = beerName;
beer.brewery = self.brewery;

لقد رأيت تحذيرات في المستندات حول المشاكل التي تعرض الجداول مع قسم واحد، وقد استخدمت حلود أبل لهذا دون جدوى. هذه الأساليب لا تدعو قبل الحادث على أي حال.

بعض الأخطاء التي تلقيتها:

Serious application error.  Exception was caught during Core Data change processing: *** -[NSCFString compareObject:toObject:]: unrecognized selector sent to instance 0x4e808c0 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[CALayer compareObject:toObject:]: unrecognized selector sent to instance 0x4e53b80 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[UITextTapRecognizer controllerWillChangeContent:]: unrecognized selector sent to instance 0x4ca5d70 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[CALayer controllerWillChangeContent:]: unrecognized selector sent to instance 0x4e271a0 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[NSCFNumber countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x4c96ee0 with userInfo (null)

كما ترون، فإن الأخطاء (عند تقديم المرء) غير متسقة، حتى عندما يتم إجراء أي تغيير في الرمز.

هل يمكن لأي شخص أن يكتشف ما أفعله خطأ؟

هل كانت مفيدة؟

المحلول

تشير أخطاءك غير المتضائلة إلى مشكلة محتملة للإصدار. خاصة وأن تغيير مندوبيك إلى مجرد تحديث البيانات يجعل القضية تذهب بعيدا. أنا شخصيا أود أن أستثمر الوقت لحل المشكلة بدلا من الترميز حوله أثناء وجود قضية رمز بالتأكيد هناك من المحتمل أن تظهر في وقت لاحق في مكان آخر.

سأقوم بما يلي:

  1. بدوره nszombie.
  2. إضافة نقطة توقف ل objc_exception_throw
  3. تشغيل في مصحح الأخطاء

عند حدوث الاستثناء، انظر إلى عنوان الذاكرة ومعرفة ما يجري الوصول إليه وأين. سيؤدي ذلك إلى عزل المشكلة وأخبرك بما يجري. سيكون من المفيد أيضا، إذا لم يكشف ذلك عن المشكلة، لنشر NSFetchedResultsController أساليب المندوب حتى أتمكن من معرفة ما إذا كان هناك أي شيء غريب فيه.

أفضل لتحديث السؤال الأصلي مع المعلومات الإضافية.

نصائح أخرى

الكود الخاص بك لإنشاء كيانات جديدة هو كل شيء غريب. ماذا عن استخدام هذا بدلا من ذلك:

Beer* beer = [NSEntityDescription insertNewObjectForEntityForName: @"Beer" 
    inManagedObjectContext: self.managedObjectContext];
beer.name = @"Grolsch";

أيضا، أنت لا تتصل NSManagedObjectContext#save:. وبعد ولكن ربما كنت تفعل ذلك في جزء من التعليمات البرمجية التي قمت بها الآن تظهر؟

بينما لم أحل هذه المشكلة بالذات، اتخذت نهجا مختلفا قليلا لكتابة الفصل الذي أعطى الوظيفة التي أريدها ولم يتسبب في ظهور المشكلة. ما زلت أستخدم NSFetchedResultScontroller، ولكن بدلا من تنفيذ جميع طرق المندوب الأربعة، أتنفذ فقط ControllerDiDChangecontent:، والتي تدعو فقط [TableViewView RoaddData].

هذا هو التنفيذ المضمن في فئة RootViewController إذا قمت بإنشاء تطبيق جديد يستند إلى التنقل في Xcode يستخدم البيانات الأساسية للتخزين. ربما تفقد بعض السيطرة على الرسوم المتحركة تحرير الجدول، لكنها كثيراً أبسط ويعمل غرامة لأغراضي.

كان لدي علة مماثلة مؤخرا - مشكلتك مع الإفراج عن الإفراج، خاصة:

[sortDescriptors release];

تحصل على كائن SortDesmags

[NSArray arrayWithObjects:sortDescriptor, nil];

التي لا تحتوي على "ALLOC" أو "نسخ" أو "جديد"، لذلك تقوم بإرجاع كائن التشغيل التلقائي. نظرا لأنك تفرج عنها مبكرا، فستحصل على مكانين حيث يمكنك تحطمه - عندما يستخدمه NSFetchRequest ذلك، وعند إصداره بواسطة المسبح. انظر أبل دليل إدارة الذاكرة لمزيد من التفاصيل.

هذا هو واحد قديم ولكن لصالح الآخرين الذين يمضون نفس المشكلة، لقد أمضيت ساعات في محاولة لفهم ما يجري وأخيرا وجدت مشكلة مع واصفتي الفرز التي تسبب هذه الأعطال العشوائية.

تباينت رسائل الخطأ ولكن كانت مرتبطة في الغالب بقصورة قائما: محدد Toobject حسب أدناه.

-[_nscfset finedobject: TOOBJECT:]: محدد غير معروف المرسل إلى المثيل - [_NSCFSTRING Sintobject: TOOBJECT:] محدد غير معترف به المرسل إلى المثيل

اقتراحي هو محاولة القضاء على جميع الواصفات الفرز وتندب من التعليمات البرمجية ثم قم بإضافتها واحدا تلو الآخر للعثور على مكان المشكلة.

حظا طيبا وفقك الله! روج

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top