NSFetchedResultsController и NSManagedObjectIDResultType аварийно завершает работу

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

Все работает как положено. Проблема заключается в добавлении / удалении объектов из моего табличного представления (из контекста). Это фрагмент кода, который я вызываю в своем 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 и NSManagedObjectID. Когда я устанавливаю для его делегата значение nil, он не сбой (даже сбой с пустыми методами делегата).

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


person schmok    schedule 29.08.2010    source источник
comment
Вы используете iOS 5? Я столкнулся с похожими сбоями и подозреваю, что это ошибка iOS 5.   -  person an0    schedule 10.10.2011


Ответы (1)


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

Из документации Apple, метод:

objectAtIndexPath:

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

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

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

и замена

[self.managedObjectContext deleteObject: objectToDelete];

с участием

[self.managedObjectContext deleteObject: ID];
person Leg10n    schedule 29.08.2010
comment
привет спасибо за ваш ответ. Из ошибки я уже догадался, что fetchedresultcontroller вызывает objectID в экземпляре NSManagedObjectID (который хранится внутри fetchedresultscontroller.fetchedObjects. Но на самом деле это не имеет для меня смысла. Вызов deleteObject: с NSManagedObjectID в качестве аргумента не работает. должен быть объектом типа NSMangedObject.К сожалению, -deleteObjectWithID: не существует. - person schmok; 30.08.2010