macos - 核心数据子/父保存异常

标签 macos cocoa core-data

我崩溃了(可能是在父 moc 保存时:

这就是 moc 的创建方式(父级):

   if (_managedObjectContextInMemoryForDynamicInformation) return _managedObjectContextInMemoryForDynamicInformation;
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinatorInMemoryForDynamicInformation];
    if (!coordinator) {
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        [dict setValue:@"Failed to initialize the store" forKey:NSLocalizedDescriptionKey];
        [dict setValue:@"There was an error building up the data file." forKey:NSLocalizedFailureReasonErrorKey];
        NSError *error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
        [[NSApplication sharedApplication] presentError:error];
        return nil;
    }
    _managedObjectContextInMemoryForDynamicInformation = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [_managedObjectContextInMemoryForDynamicInformation setPersistentStoreCoordinator:coordinator];
    [_managedObjectContextInMemoryForDynamicInformation setUndoManager:nil];
    return _managedObjectContextInMemoryForDynamicInformation;

child :

    AppDelegate *delegateMain = (AppDelegate *)[[NSApplication sharedApplication] delegate];
    _mocInMemoryForDynamicInformation = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    [_mocInMemoryForDynamicInformation setUndoManager:nil];
    _mocInMemoryForDynamicInformation.parentContext = delegateMain.managedObjectContextInMemoryForDynamicInformation;

这就是我保存的方式:

-(void) finalSaveMocInMemoryForDynamicInformation;
{
    [_mocInMemoryForDynamicInformation performBlock:^{
        // do something that takes some time asynchronously using the temp context

        // push to parent
        NSError *error;
        if ([_mocInMemoryForDynamicInformation save:&error])
        {
            AppDelegate *delegateMain = (AppDelegate *)[[NSApplication sharedApplication] delegate];

            // save parent to disk asynchronously
            [delegateMain.managedObjectContextInMemoryForDynamicInformation performBlock:^{
                @try {
                    NSError *error;
                    if (![delegateMain.managedObjectContextInMemoryForDynamicInformation save:&error])
                    {
                        [self logError:error];
                    }
                }
                @catch (NSException *exception) {
                    NSLog(@"ERROR:%@:%@ exception->%@ inside managedObjectContextInMemoryForDynamicInformation",[self class], NSStringFromSelector(_cmd),exception);
                    //[[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:moc];

                    return ;
                }

            }];
        } else [self logError:error];
    }];
}

Application Specific Information: * Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0x7fd8a71d87a0 '' abort() called terminate called throwing an exception

Application Specific Backtrace 1: 0 CoreFoundation
0x00007fff86e6f0a6 __exceptionPreprocess + 198 1 libobjc.A.dylib
0x00007fff849353f0 objc_exception_throw + 43 2 CoreData
0x00007fff8737eec4 _PFFaultHandlerLookupRow + 1348 3 CoreData
0x00007fff8737e61f _PF_FulfillDeferredFault + 239 4 CoreData
0x00007fff873892cd _PF_ManagedObject_WillChangeValueForKeyIndex + 77 5 CoreData 0x00007fff8738cc51 _sharedIMPL_setvfk_core + 129 6 CoreData 0x00007fff873a4eaa -[NSManagedObject(_NSInternalMethods) _didChangeValue:forRelationship:named:withInverse:] + 1434 7 Foundation 0x00007fff878fe860 NSKeyValueNotifyObserver + 390 8 Foundation
0x00007fff87900279 NSKeyValueDidChange + 456 9 Foundation
0x00007fff878bb7df -[NSObject(NSKeyValueObserverNotification) didChangeValueForKey:] + 130 10 CoreData
0x00007fff873898c1 -[NSManagedObject didChangeValueForKey:] + 113 11 CoreData 0x00007fff873e566d -[NSManagedObject(_NSInternalMethods) _updateFromRefreshSnapshot:includingTransients:] + 685 12 CoreData 0x00007fff873b0969 -[NSManagedObjectContext(_NestedContextSupport) _copyChildObject:toParentObject:fromChildContext:] + 121 13 CoreData 0x00007fff873b0505 -[NSManagedObjectContext(_NestedContextSupport) _parentProcessSaveRequest:inContext:error:] + 629 14 CoreData 0x00007fff873df72a __82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke_0 + 634 15 libdispatch.dylib 0x00007fff8aad6a2d _dispatch_barrier_sync_f_slow_invoke + 77 16 libdispatch.dylib 0x00007fff8aad10b6 _dispatch_client_callout + 8 17 libdispatch.dylib 0x00007fff8aad60c8 _dispatch_main_queue_callback_4CF + 275 18 CoreFoundation 0x00007fff86e110fe __CFRunLoopRun + 1614 19 CoreFoundation 0x00007fff86e106b2 CFRunLoopRunSpecific + 290 20 HIToolbox
0x00007fff89d950a4 RunCurrentEventLoopInMode + 209 21 HIToolbox
0x00007fff89d94e42 ReceiveNextEventCommon + 356 22 HIToolbox
0x00007fff89d94cd3 BlockUntilNextEventMatchingListInMode + 62 23 AppKit 0x00007fff8ffcd613 _DPSNextEvent + 685 24 AppKit 0x00007fff8ffcced2 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 128 25 AppKit 0x00007fff8ffc4283 -[NSApplication run] + 517 26 AppKit 0x00007fff8ff68cb6 NSApplicationMain + 869 27 callsfreecall
0x000000010e6ab472 main + 34 28 libdyld.dylib
0x00007fff858a47e1 start + 0 29 ???
0x0000000000000002 0x0 + 2

最佳答案

你的变量标识符真的很困惑。像parentContext、child Context、rootContext 之类的名称很棘手?

无论如何,问题可能不是保存操作。在第一个 View 中,看起来好像您更改了一个对象与另一个对象的关系,但另一个对象不再存在。如果另一个对象故障进入子上下文并在存储中删除,则可能会发生这种情况。 (可能是因为父上下文删除了该对象并保存了其状态。)

关于macos - 核心数据子/父保存异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17024859/

相关文章:

macos - Mac OS X 上的免费磁盘空间栏

cocoa - 如何在 Cocoa 中打印控件层次结构?

macos - 删除不会失效,直到保存: is it true?

swift - 保存到 Today Extension 中的特定核心数据对象

objective-c - 如何使用 Cocoa 或 Foundation 获取当前连接的网络接口(interface)名称?

python - 如何替换python3中的has_key?

macos - 使用 NSArrayController 过滤单列 NSTableView

ios - 父 MOC 从子 MOC 获取空数据的变化

ios - 从核心数据中的一对多关系中删除对象

ios - 为什么 Cocoapods 将 HockeyMac-SDK 添加到我的 iOS 目标?