2

В настоящее время я работаю над приложением ipad, в котором я получаю много данных с основными данными. Чтобы сохранить низкий профиль памяти, я устанавливаю запросы resultType на NSManagedObjectIDResultType и захватывает объекты с помощью -objectWithID: метод всякий раз, когда мне нужны реальные данные.NSFetchedResultsController и NSManagedObjectIDResultType сбой

Все работает должным образом. Проблема заключается в том, когда дело доходит до добавления/удаления объектов из моего представления таблицы (из контекста). То кусок кода, который я называю в моем Tableview: commitEditingStyle: forRowAtIndexPath:

if(editingStyle == UITableViewCellEditingStyleDelete) 
{   

    NSManagedObjectID *ID = [fetchedResultsController objectAtIndexPath: indexPath]; 
    NSManagedObject *objectToDelete = [self.managedObjectContext objectWithID: ID]; 

     [self.managedObjectContext deleteObject: objectToDelete]; 

    [self.managedObjectContext save: nil]; 
} 

Он бросает мне исключение: "* Согласующее приложение из-за неперехваченное исключение 'NSInvalidArgumentException', причина:«* - [_ NSObjectID_48_0 ObjectId]: непризнанные селектор направлен например 0x5e56900' »

Трассировка:

#0 0x9953cef6 in __kill 
#1 0x9953cee8 in kill$UNIX2003 
#2 0x995cf62d in raise 
#3 0x995e56e4 in abort 
#4 0x95826fda in __gnu_cxx::__verbose_terminate_handler 
#5 0x02d9d61c in _objc_terminate 
#6 0x9582517a in __cxxabiv1::__terminate 
#7 0x958251ba in std::terminate 
#8 0x958252b8 in __cxa_throw 
#9 0x02d9d3d8 in objc_exception_throw 
#10 0x02c84a5b in -[NSObject doesNotRecognizeSelector:] 
#11 0x02c01676 in ___forwarding___ 
#12 0x02c009f2 in __forwarding_prep_0___ 
#13 0x0281f0f7 in -[_PFBatchFaultingArray arrayFromObjectIDs] 
#14 0x0281fe4b in -[_PFMutableProxyArray managedObjectIDAtIndex:] 
#15 0x0281ec8e in -[_PFMutableProxyArray indexOfManagedObjectForObjectID:] 
#16 0x028823b8 in -[NSFetchedResultsController(PrivateMethods) _preprocessDeletedObjects:deletesInfo:sectionsWithDeletes:] 
#17 0x02885159 in -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] 
#18 0x00065586 in _nsnote_callback 
#19 0x02beb165 in _CFXNotificationPostNotification 
#20 0x0005c2ca in -[NSNotificationCenter postNotificationName:object:userInfo:] 
#21 0x027d838d in -[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] 
#22 0x0283fe83 in -[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:] 
#23 0x027b9af6 in -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] 
#24 0x027f4a61 in -[NSManagedObjectContext save:] 
#25 0x0035d361 in -[UITableView(UITableViewInternal) animateDeletionOfRowWithCell:] 
#26 0x00306cee in -[UIApplication sendAction:to:from:forEvent:] 
#27 0x0038043e in -[UIControl sendAction:to:forEvent:] 
#28 0x003828c0 in -[UIControl(Internal) _sendActionsForEvents:withEvent:] 
#29 0x0038146d in -[UIControl touchesEnded:withEvent:] 
#30 0x00325de8 in -[UIWindow _sendTouchesForEvent:] 
#31 0x0030b643 in -[UIApplication sendEvent:] 
#32 0x003131d8 in _UIApplicationHandleEvent 
#33 0x0351617c in PurpleEventCallback 
#34 0x02bd289c in CFRunLoopRunSpecific 
#35 0x02bd18a8 in CFRunLoopRunInMode 
#36 0x0351489d in GSEventRunModal 
#37 0x03514962 in GSEventRun 
#38 0x00311372 in UIApplicationMain 
#39 0x00002436 in main at main.m:14 

Я предполагаю, что это проблема с NSFetchedResultsController и NSManagedOb jectIDs. Когда я устанавливаю свой делегат на нуль, он не сбой (даже с ошибками с пустым методом делегирования).

Любая идея? Было бы хорошей идеей, если я избавлюсь от NSFetchedResultsController и сделаю обновления вручную, наблюдая уведомления NSManagedObjectContext?

+0

вы используете прошивкой 5? Я столкнулся с подобными сбоями, и я подозреваю, что это ошибка iOS 5. – an0

ответ

0

Я думаю [fetchedResultsController objectAtIndexPath: indexPath]; возвращает то, что не является экземпляром NSManagedObjectID, а экземпляром NSObject.

Из документации яблока, метод:

objectAtIndexPath:

Возвращает объект по данному индексу пути в извлекающих результатах.

не идентификатор объекта, попробуйте закомментировать или удалить строку:

NSManagedObject *objectToDelete = [self.managedObjectContext objectWithID: ID]; 

и заменяющий

[self.managedObjectContext deleteObject: objectToDelete]; 

с

[self.managedObjectContext deleteObject: ID]; 
+0

эй спасибо за ваш ответ. Из-за ошибки я уже догадался, что fetchedresultcontroller вызывает objectID в экземпляре NSManagedObjectID (который хранится внутри fetchedresultscontroller.fetchedObjects. Но для меня это не имеет смысла. Вызов deleteObject: с NSManagedObjectID в качестве аргумента doesn't Это должен быть объект типа NSMangedObject. К ​​сожалению, -deleteObjectWithID: не существует. – schmok

Смежные вопросы