2011-08-16 54 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-線 –