2

在我正在编写的一些测试的上下文中,我发现了以下问题。除了其他自然目的之外,我还使用 RestKit 0.20.2 来管理与核心数据相关的方面。

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

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 实例似乎不是最新的底层持久存储。有没有人可以告诉我我做错了什么?


更多细节

我刚刚移动了此日期字段的默认语义,以便始终不为零并将 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 或 0:59:59分别)。

这真让我抓狂。

4

0 回答 0