RestKit/CoreData 没有立即将关系保存到持久存储

Posted

技术标签:

【中文标题】RestKit/CoreData 没有立即将关系保存到持久存储【英文标题】:RestKit/CoreData not saving relationships immediately to the persistent store 【发布时间】:2013-12-27 15:24:46 【问题描述】:

RestKit 或 CoreData 是否有一些奇怪的上下文保存机制?我的意思是我下载了我的托管对象,如果我快速终止应用程序并再次运行它,我会看到一些关系对象没有保存到持久存储中。但是,当我在杀死应用程序之前等待 10-15 秒时,这些对象会被保存,我可以在再次运行应用程序时获取它们。

那么它是如何工作的呢?对象没有保存在类似事务的操作中是否正常(无论是整个对象及其关系还是什么都没有)?

也许我只是幸运地度过了这 15 秒,并且由于 CoreData/RestKit/我的代码中的一些错误,这些关系对象可能在某些情况下根本不会被保存?

我使用以下方式下载对象:

RKObjectManager *manager = [RKObjectManager sharedManager];
[manager getObjectsAtPath:@"/" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 

    NSLog(@"OK");
    [self saveContext];

 failure:^(RKObjectRequestOperation *operation, NSError *error) 
    NSLog(@"ERROR");
];

并通过以下方式保存上下文:

[[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext save:&err]; 

有什么帮助吗?

【问题讨论】:

你能在主队列中明确地执行保存操作吗?只是为了确定.. 保存时我正在检查 [[NSThread currentThread] isMainThread],它总是等于 YES。奇怪的是,主对象(订单)被保存了,而子对象(项目)却没有。 【参考方案1】:

RestKit 在调用成功块之前为您保存上下文 - 您不需要显式保存。

通过“杀死应用程序”我猜你是在 Xcode 中停止它?这是一个完整的终止,任何尚未完成的事情都没有机会完成。这是不切实际的测试,你不应该太依赖它。

如果您想确切了解保存操作何时完成,请注意发布的相应通知。

【讨论】:

以上是关于RestKit/CoreData 没有立即将关系保存到持久存储的主要内容,如果未能解决你的问题,请参考以下文章

RestKit / Core Data / Offline - 我需要 UUID 还是 RestKit 足够聪明?

RestKit + CoreData,理解 RKManagedObjectRequestOperation

RestKit、核心数据和关系问题。父对象不识别子集

使用 CoreData 时 RestKit 没有正确映射属性

Restkit/Core Data 关系映射,实体到相同类型的实体(父/子)

RestKit + CoreData:从CoreData缓存中排除某些对象