Исключение / сбой при объединении управляемых контекстов CoreData

Я получаю следующее исключение при попытке объединить управляемый контекст (работает в фоновом потоке) с моим основным управляемым контекстом (на mainthread). Кажется, я не вижу исключения в своем собственном выражении @try. Кто-нибудь может понять это?

Я использую политику слияния по умолчанию, но я не уверен, что это правильно – эта проблема очень прерывистая – бывает редко, но приводит к сбою моего приложения.

Exception Type: EXC_CRASH (SIGABRT) Exception Codes: 0x00000000, 0x00000000 Crashed Thread: 0 Last Exception Backtrace: 0 CoreFoundation 0x37e3b8bf __exceptionPreprocess + 163 1 libobjc.A.dylib 0x319211e5 objc_exception_throw + 33 2 CoreData 0x344b7ea5 -[NSSQLiteStatement cachedSQLiteStatement] + 1 3 CoreData 0x344b774f -[NSSQLiteConnection prepareSQLStatement:] + 55 4 CoreData 0x3455b049 -[NSSQLChannel selectRowsWithCachedStatement:] + 61 5 CoreData 0x34586d63 newFetchedRowsForFetchPlan_MT + 783 6 CoreData 0x344bfb07 -[NSSQLCore newRowsForFetchPlan:] + 351 7 CoreData 0x34565011 -[NSSQLCore fetchRowForObjectID:] + 1005 8 CoreData 0x344d1a57 -[NSSQLCore newValuesForObjectWithID:withContext:error:] + 195 9 CoreData 0x344d0f83 _PFFaultHandlerLookupRow + 423 10 CoreData 0x3450e111 -[NSFaultHandler fulfillFault:withContext:] + 25 11 CoreData 0x34518999 -[NSManagedObject(_NSInternalMethods) _newPropertiesForRetainedTypes:andCopiedTypes:preserveFaults:] + 77 12 CoreData 0x345178ef -[NSManagedObject(_NSInternalMethods) _newAllPropertiesWithRelationshipFaultsIntact__] + 79 13 CoreData 0x345284db -[NSManagedObjectContext(_NSInternalChangeProcessing) _establishEventSnapshotsForObject:] + 47 14 CoreData 0x3452694b -[NSManagedObjectContext deleteObject:] + 155 15 CoreData 0x345238a1 -[NSManagedObjectContext _mergeChangesFromDidSaveDictionary:usingObjectIDs:] + 813 16 CoreData 0x34522c35 -[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:] + 189 17 myapp 0x0008f0e9 0x8d000 + 8425 18 CoreFoundation 0x37d9a22b -[NSObject performSelector:withObject:] + 43 19 Foundation 0x31d75757 __NSThreadPerformPerform + 351 20 CoreFoundation 0x37e0fb03 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 21 CoreFoundation 0x37e0f2cf __CFRunLoopDoSources0 + 215 22 CoreFoundation 0x37e0e075 __CFRunLoopRun + 653 23 CoreFoundation 0x37d914dd CFRunLoopRunSpecific + 301 24 CoreFoundation 0x37d913a5 CFRunLoopRunInMode + 105 25 GraphicsServices 0x3790ffcd GSEventRunModal + 157 26 UIKit 0x35221743 UIApplicationMain + 1091 

Я запускаю фоновый контекст в start () nsoperation следующим образом:

 AppDelegate *appController = [[UIApplication sharedApplication] delegate]; _managedObjectContext = [[NSManagedObjectContext alloc] init]; [appController setPersistentStore:_managedObjectContext]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedDeletedObjects:) name:NSManagedObjectContextDidSaveNotification object:_managedObjectContext]; 

Я также установил событие уведомления, которое вызывается, когда объекты удаляются в контексте фонового управления, тогда обратный вызов выполняет:

 -(void)receivedDeletedObjects:(NSNotification *)note { AppDelegate *appController = [[UIApplication sharedApplication] delegate]; NSManagedObjectContext *mainContext = [self managedObjectContext]; [mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) withObject:note waitUntilDone:NO]; } 

Это в значительной степени код. У меня есть 4 разных фоновых потока, каждый со своим собственным управляемым контекстом, делая то же самое, что и с основным контекстом. Мне интересно, что несколько потоков в одно и то же время попадают в mergeChangesFromContextDidSaveNotification, но это не должно быть так, поскольку он всегда называется mainthread.

One Solution collect form web for “Исключение / сбой при объединении управляемых контекстов CoreData”

Как насчет этого:

(все в AppDelegate, вызовите freshContextForBackgroundTask из фона Thread и используйте save: для запуска слияния.) Примечание. syncObj – это простой экземпляр NSObject, необходимый для синхронизации в делегате приложения при использовании большого количества фоновых потоков (или просто неудача с планированием)

 -(NSManagedObjectContext*) freshContextForBackgroundTask { @synchronized(syncObj) { NSManagedObjectContext* r = [[NSManagedObjectContext alloc] init]; [r setPersistentStoreCoordinator:self.managedObjectContext.persistentStoreCoordinator]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(backgroundContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:r]; return r; } } - (void)backgroundContextDidSave:(NSNotification *)notification { /* Make sure we're on the main thread when updating the main context */ //NSLog(@"merging change: %@",notification); dispatch_async(dispatch_get_main_queue(), ^{ NSManagedObjectContext *context = [self managedObjectContext]; // this for loop may not be needed for your purpose. for(NSManagedObject *object in [[notification userInfo] objectForKey:NSUpdatedObjectsKey]) { [[context objectWithID:[object objectID]] willAccessValueForKey:nil]; } [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]; }); } 

Ваш подход кажется странным. Особенно, когда вы устанавливаете постоянное хранилище делегата приложения в (nil) один из свежеисследованных контекстов.

  • Повернуть UIImageView вокруг своей центральной точки?
  • Как перезагрузить табличное представление, когда я получаю push-уведомление?
  • Применение предела Word к UITextView
  • CGFloat как собственность
  • Как играть в видео vimeo на UIwebview не в полноэкранном режиме ios swift 2.0
  • iOS: Как определить тип CPU, например, A4 или A5, или архитектуру набора команд arm6 или arm7?
  • Управление аудиоустройством Bluetooth с iPhone
  • Заполнение клеток TableView с использованием GCD
  • Каков наилучший способ решения проблемы утечки памяти на iphone?
  • Выбор строки, когда UITableView находится в режиме редактирования
  • Проект Xcode внутри проекта
  • Interesting Posts

    Разница между загрузкой многостраничной формы и NSURLSession.uploadTaskWithRequest

    Как изменить цвет фона UINavigationItem?

    iOS: программно добавлять пользовательский шрифт во время выполнения

    Xcode 8 GM – код ошибки SQLite: 6922, «ошибка ввода-вывода диска»

    Обработчик завершения не работает в viewDidLoad?

    Использование настраиваемого макета перехода при выполнении переходов между макетами и макетами

    Реализация протокола реализации протокола по умолчанию

    Получение данных ответа от ошибки Alamofire

    скрытые файлы с расширением .icloud в контейнере ubiquity

    Измените текст атрибута UILabel без потери форматирования?

    фиксированные прокрутки заголовка / перетаскивания в jquery mobile

    Могу ли я безопасно удалить содержимое папки с данными Xcode Derived?

    Как скрыть нижнюю строку UINavigationBar 1px

    Как создать короткую ссылку AppStore.com?

    Кнопка копирования из метки (IOS)

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.