2011-08-16 43 views
1

我从coreData开始,我有疑问。CoreData - 关于何时保存

我有一个应用程序,从服务器读取数据,我解析数据,并得到对象的NSDictionary。

要保存的数据coreData,我这样做:

for (NSDictionary *activityData in arrayWithResult){ 
     [CompanyActivity createActivityWithInfoFromServer:activityData inManagedObjectContext:self.managedObjectContext]; 
    } 

    if (![self.managedObjectContext save:&error]) 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 

这读取约300条记录。方法'createActivityWithInfoFromServer:'检查是否有该名称的记录。如果是这样,更新数据,如果没有,创建一个。

问题是,当“for”循环运行时,如果我与用户界面交互,它将停止保存核心数据,有时并不总是如此。为什么?

如果我在周期内采取了SAVE,问题就会消失。

我该怎么办?

感谢所有,

RL

+0

你是什么意思“它停止储蓄”?你有错误吗?对象是否已创建但未保存? – TechZen

+0

没有错误。我有一个NSLog,它会停止记录,并且不会创建对象。有时,它会创建168,其他时间,230 ...其他时间,所有这些...... –

+0

您的意思是'arrayWithResult'有x个条目但只有y个被管理对象被保存?您如何知道应该创建和保存多少个对象,如果某些字典可能在Core Data中有重复项? – TechZen

回答

0

根据您的理由是什么,仍然允许用户与UI交互,你既可以禁用该UI的那段时间,或创建一个新的线程来处理你发布的那段代码。

至于为什么它只是不能有效保存的原因,我认为有时它不必创建尽可能多的新对象并且更快完成,并且可以在与UI进行交互之前保存。如果保存在for循环中,而不是在查看效率相当低的每个项目后保存所有内容。

+0

创建该作业的线程,如下所示: dispatch_queue_t registerDeviceQueue = dispatch_queue_create(“RegisterDevice”,NULL); dispatch_async(registerDeviceQueue,^ { \t为(*的NSDictionary在activityData arrayWithResult){ \t [CompanyActivity createActivityWithInfoFromServer:activityData inManagedObjectContext:self.managedObjectContext]; } }); dispatch_release(registerDeviceQueue); –

+0

是的,它看起来像你有正确的想法,如果你想要更多的材料这个问题似乎很好地覆盖它:http://stackoverflow.com/questions/3869217/iphone-ios-running-in-separate-线 –