保存到RKManagedObjectStore的mainQueueManagedObjectContext的实体在下一次构建时消失

ooh*_*aba 3 core-data ios restkit

使用RestKit v0.20.0-rc1,我成功地创建了CoreData映射并从捆绑的JSON文件中导入对象,并使数据保持多个构建.但是,当我创建自己的实体并保存它时,如果我使用[RKManagedObjectStore defaultStore] .mainQueueManagedObjectContext,则实体会在下次构建时立即消失,但如果我使用[RKManagedObjectStore defaultStore] .persistentStoreManagedObjectContext,则会保持正确.

    UserAccount *userAccount = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:managedObjectContext];
    userAccount.userID = @(userID);
    [userAccount addContactMethodsObject:phone];
    NSError *error = nil;
    if(![managedObjectContext save:&error])
        NSLog(@"%@", error);
Run Code Online (Sandbox Code Playgroud)

使用managedObjectContext在上面的代码中保存没有错误,并且来自同一上下文的任何提取都会正确地返回实体.但是在后续构建中,如果我使用mainQueueManagedObjectContext,则提取将始终返回nil,即使上面的代码在主线程上运行.

有什么我想念的吗?

Ale*_*xDG 9

在使用mainQueueManagedObjectContext创建的上下文中使用save:时,它不会将其更改保留到存储中.根据RKManagedObjectStore(bolding mine)的文档:

托管对象上下文层次结构旨在将主线程与磁盘I/O隔离并避免死锁.由于主上下文管理自己的专用队列,因此保存主队列上下文不会导致将对象保存到持久性存储中.必须保存主要上下文,以便将对象保留到磁盘.

如果要保留更改并仍使用mainQueueManagedObject上下文,请尝试使用

- (BOOL)saveToPersistentStore:(NSError **)error
Run Code Online (Sandbox Code Playgroud)

这将推动上下文层次结构的变化.

有关RKManagedObjectStore的相关文档,请访问http://restkit.org/api/latest/Classes/RKManagedObjectStore.html#//api/name/persistentStoreManagedObjectContext

有关restkit NSManagedObject类别的文档,请访问 http://restkit.org/api/0.20.0-pre3/Categories/NSManagedObjectContext+RKAdditions.html