Базовая нить базовых данных NSManagedObjectContext ошибка слияния - PullRequest
8 голосов
/ 27 января 2011

Я пишу приложение для Ipad, которое показывает статьи и загружает новые статьи в отдельном NSOperation в очереди и вставляет их в основные данные. В настоящее время у меня есть отдельный контекст для операции, созданный в основном методе операции и использующий тот же координатор, что и основной контекст. Я использую тот же шаблон, который был предложен много прослушивания в этой операции для NSManagedObjectContextDidSaveNotification и затем вызывая mergeChangesFromContextDidSaveNotification в контексте основного потока. Проблема в том, что я получаю эту ошибку:

2011-01-27 07:26:02.574 Zagazine[12298:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object's persistent store is not reachable from this NSManagedObjectContext's coordinator'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x3284b987 __exceptionPreprocess + 114
    1   libobjc.A.dylib                     0x31aca49d objc_exception_throw + 24
    2   CoreData                            0x3549d07b _PFRetainedObjectIDCore + 638
    3   CoreData                            0x3549cdfb - [NSManagedObjectContext(_NSInternalAdditions) _retainedObjectWithID:] + 14
    4   CoreData                            0x354bf85b -[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:] + 2170
    5   CoreFoundation                      0x327e9bbf -[NSObject(NSObject) performSelector:withObject:] + 22
    6   Foundation                          0x320fd795 __NSThreadPerformPerform + 268
    7   CoreFoundation                      0x328017dd __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12
    8   CoreFoundation                      0x327d34fb __CFRunLoopDoSources0 + 194
    9   CoreFoundation                      0x327d2e5b __CFRunLoopRun + 230
    10  CoreFoundation                      0x327d2c87 CFRunLoopRunSpecific + 230
    11  CoreFoundation                      0x327d2b8f CFRunLoopRunInMode + 58
    12  GraphicsServices                    0x3094a4ab GSEventRunModal + 114
    13  GraphicsServices                    0x3094a557 GSEventRun + 62
    14  UIKit                               0x32c14329 -[UIApplication _run] + 412
    15  UIKit                               0x32c11e93 UIApplicationMain + 670
    16  ArticleApp                          0x0000233f main + 70
    17  ArticleApp                          0x000022f4 start + 40
)
terminate called after throwing an instance of 'NSException'
Program received signal:  “SIGABRT”.

Эта интересная часть заключается в том, что эта ошибка возникает только при первом запуске приложения после его установки. Все последующие запуски после установки работают нормально. Кто-нибудь знает, почему эта ошибка происходит и почему это происходит только при первоначальной установке.

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

- (void)mergeChanges:(NSNotification *)notification {
    AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
    NSManagedObjectContext *mainContext = [appDelegate managedObjectContext];

    // Merge changes into the main context on the main thread
    [mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
                              withObject:notification
                           waitUntilDone:YES];  
}

Ответы [ 2 ]

17 голосов
/ 27 января 2011

Эта интересная часть заключается в том, что эта ошибка возникает только при первом запуске приложения после его установки.Все последующие запуски после установки работают нормально.Кто-нибудь знает, почему эта ошибка происходит и почему она возникает только при первоначальной установке.

Тогда я предполагаю, что постоянное хранилище неправильно связывается с файлом на диске при первом запуске,Файл, поддерживающий основное хранилище данных, не материализуется, когда вы назначаете его URL-адрес координатору постоянного хранилища.Это только материализуется, когда это сначала сохранено.

А объединение изменений без готовности файла резервной копии вызывает много проблем.

Попробуйте сохранить контекст один раз из основного потока при первом запуске в самом начале выполнения, когда контекст Core Data еще пуст, до создания фонового потока.Надеюсь, это решит вашу проблему.

0 голосов
/ 24 января 2013

Было ли у вас какое-либо другое уведомление mergeChangesFromContextDidSaveNotification, наблюдаемое в каком-либо другом контексте? Если это так, это может быть порядок, который вы уведомляете. Он может уведомлять контекст, который не знает о схеме, на которую влияют изменения (иначе, «Постоянное хранилище объекта недоступно из этого координатора NSManagedObjectContext»).

...