iOS - 不同的MOC和托管对象状态

时间:2013-09-03 09:05:28

标签: core-data ios6 restkit-0.20

在我写的一些测试中,我发现了以下问题。我使用RestKit 0.20.2,除了其他自然目的之外,还管理我的coredata相关方面。

在其中一个测试中,我通过为其指定一个Nil值(它是一个可选字段)来创建一个CoreData实体A,其中包含Date作为其字段之一。我的保存功能执行以下代码:

NSError* myError;
[[RKTestFactory managedObjectStore].mainQueueManagedObjectContext saveToPersistentStore:&myError];
NSLog(@"Save done on main queue with myError: %@", myError); 
NSAssert1(myError == Nil, @"Coredata saving error: %@", myError);

在此保存之后,运行一个算法,该算法在A上运行并更新该日期字段。此算法适用于私有托管对象上下文:

// Get a Local Managed Object Context
NSManagedObjectContext* myLocalMOC = [[DDRestKitManager sharedInstance].objectManager.managedObjectStore  newChildManagedObjectContextWithConcurrencyType:NSPrivateQueueConcurrencyType trackChanges:YES];

(DDRestKitManager是一个单独管理项目的每个与RestKit相关的方面)。该算法首先在其私有托管对象上下文中使用FetchRequest检索A,然后对其进行操作,最后更新其日期字段。然后它会保存它处理的每个与CoreData相关的方面(包括更新的A状态),并在其私有MOC上保存。

在上一个测试体中,我需要在更新一些字段后再次在同一个实体A上再次调用相同的算法以测试新的算法结果,我需要将A的日期字段放回去在调用算法之前到Nil。这就是我的工作:

A.date_field = Nil;
[[TestCoreDataManager sharedInstance] save];  
// <invoke_algorithm>

(TestCoreDataManager是另一个提供对象的单例,并通过之前报告的函数保存它们)。问题是,当算法再次检索对象时,date_field不是Nil,但仍包含先前分配的值。

似乎算法在其私有上下文中检索的A实例与底层持久性存储不是最新的。有没有人可以告诉我我做错了什么?


更多细节

我刚刚移动了这个日期字段的默认语义,以便始终不是nil并且默认值为0。我重写了算法,以便测试条件为[A.date_field timeIntervalSince1970] == 0而不是A.date_field == Nil

在我的代码中,为了满足该测试,我使用以下代码

A.date_field = [NSDate dateWithTimeIntervalSince1970:0];
[TestCoreDataManager save]; // [mainManagedObjectContext saveOnPersistentStore:&myError];

// Get a Local Managed Object Context
NSManagedObjectContext* myLocalMOC =
[[DDRestKitManager sharedInstance].objectManager.managedObjectStore
 newChildManagedObjectContextWithConcurrencyType:NSPrivateQueueConcurrencyType
 tracksChanges:YES];

<query_for_A_entities_in_the_store>;

此时A.date_field包含从1970年开始重置为0秒之前的值。

更奇怪的部分如下。如果我更换

A.date_field = [NSDate dateWithTimeIntervalSince1970:0];

A.date_field = [NSDate dateWithTimeIntervalSince1970:1];

A.date_field = [NSDate dateWithTimeIntervalSince1970:-1];

并保持其余代码不变,然后子管理对象上下文获取一个A对象,date_field现在是最新的正确日期和时间(1970,1:00:01 am或0:59 :分别是上午59点。

这让我发疯了。

0 个答案:

没有答案