2012-10-15 53 views
2

我正在使用UIManagedDocument在應用程序中設置核心數據。然後,我在一個循環中向數據庫添加大約1000個NSManagedObject(s)。我使用的最初處理的對象的數據在後臺線程:使用加速通過UIManagedDocument將對象插入到Core Data中?

NSManagedObjectContext *moc = [[self managedDocument] managedObjectContext]; 
[moc performBlock:^{ 
    // ADD TO CORE DATA 
    ... 
    ... 

dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 
dispatch_async(backgroundQueue, ^{ 
    // PROCESS OBJECTS HERE 
    ... 
    ... 

從後臺線程將它們添加到核心數據之前

// CREATE 
Fruit *fruit = [NSEntityDescription insertNewObjectForEntityForName:@"Fruit" inManagedObjectContext:context]; 
// POPULATE 
[fruit setName:name]; 
[fruit setAge:age]; 
[fruit setType:type]; 
... 

我的問題是:

對1進行上述操作000+對象目前大約需要2.2secs,我沒有對Core Data進行任何保存,直到所有的對象都被插入,所有對象都在內存中完成,沒有I/O開銷。正如你上面所看到的,我所有的處理都是在後臺線程上完成的,但是當我將新對象插入到Core Data中時,我必須使用performBlock:來確保插入在UIManagedDocument最初的主線程上完成創建。

我想知道的是,是否有加快插入對象的方法,可能是將多個NSManagedObjects「批處理」在一起並將它們添加到一個命中中,或者只是採取相同的數量時間與我現在正在做的一樣(它仍然增加了1000多個對象)。

我讀過一些關於創建一個新的上下文,然後將其與NSManagedDocument上下文合併,但我不知道如果這是適當的或如何做到這一點,如果是。任何幫助/信息將不勝感激。

回答

2

1)把您的上下文撤消管理爲nil:不需要

[moc setUndoManager:nil] 

撤消信息,如果你永遠不會在保存過程中撤消。

2)您已通過添加多個對象並進行一次保存來進行批處理。

3)使用較小批量的實驗。一個大的保存可能會有問題,但1000應該沒問題。

4)如果更改批量大小,您還需要嘗試釋放已創建的對象。

+1

謝謝你的發帖,非常感謝。 – fuzzygoat