我有一个多线程应用程序,可以在服务器和ios设备之间同步数据。
同步发生在单独的线程上。我对 NSManagedObjectContext 使用单例模式,它是在主线程上创建的。我开始遇到线程问题,经过研究,我发现不应该在已经初始化的线程之外使用上下文。所以我在主线程的上下文中调用init并在我的同步线程中使用它。为了解决这个问题,我做了以下工作。
我创建了一个返回 NSPersistentStoreCoordinator 的全局方法,并且在同步线程上我使用此协调器来创建新的上下文。这摆脱了线程问题,但现在我得到了一些其他奇怪的行为。
在我的同步线程中,我调用 executeFetchRequest 方法,然后将结果数组返回给其他方法。当我调试时,我看到有93条记录,并且都填充了数据。然后我在返回的方法上检查数组,但即使我仍然获得93条记录,列都具有nil值。
这是代码
+(NSArray *) GetAllRowsInTable:(NSString *) tableName
{
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setPersistentStoreCoordinator:[Globals GetPersistentStoreCoordinator]];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:tableName inManagedObjectContext:context]];
NSError *error;
NSArray *results = [context executeFetchRequest:request error:&error];
return results;
}
有人知道为什么会这样吗?
答案 0 :(得分:0)
我想我知道为什么会这样。在阅读NSManagedObject后,我得出以下结论。当调用ExecuteFetchRequest时,这将返回一个故障结果数组,这意味着除非在NSManagedObject上调用valueForKey方法,否则不会从持久存储中检索其值。由于我在方法中创建上下文并将结果返回到某个其他方法,因此创建结果的上下文不存在,因此我得不到任何结果。所有故障最终都失败了。