在我写的一些测试中,我发现了以下问题。我使用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点。
这让我发疯了。