2016-04-27 68 views
0

假設我有來自Web服務API的一千條記錄,並且我想在privateContext中的核心數據中添加這些記錄。我怎樣才能同時進行而不是線性進行。在CoreData中同時插入iOS

我能將像dispatch_apply

let entity:NSEntityDescription = NSEntityDescription.entityForName(entityName, 
      inManagedObjectContext:managedContext)! 
let managedObject:NSManagedObject = NSManagedObject(entity: entity, 
      insertIntoManagedObjectContext: managedContext) 

同時運行?

+0

您可以使用dispatch_async,performBlock(在managedContext中)。但是,不要每次都保存上下文,一旦完成所有插入操作,請執行保存上下文。 –

+0

我的問題有點不同....我想做同時插入。例如我想要在10個不同的隊列中並行插入100條記錄。 –

+0

從這篇文章(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Concurrency.html)看來,您似乎需要爲每個隊列使用不同的專用隊列上下文。如果你得到它的工作,我想知道底層數據庫是否允許並行更新或自己序列化。 –

回答

0

試試這個:

func persistAsyncInContext<T:AnyObject>(parentContext:NSManagedObjectContext , objetcsFromJSON:[T] , completion:()->Void){ 

    let workQ = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT) 
    let workGroup = dispatch_group_create() 

    for objectFromJSON in objetcsFromJSON{ 

     dispatch_group_enter(workGroup) 
     let workerChildMoc = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType) 
     workerChildMoc.parentContext = parentContext 
     workerChildMoc.performBlock{ 

      let managedObject = NSEntityDescription.insertNewObjectForEntityForName("entityName", inManagedObjectContext: workerChildMoc) 
      //if objectFromJSON is also an array then loop it and move the line above that creates new object into the loop. 

      do 
      { 
       try workerChildMoc.save() 
      } 
      catch 
      { 
       //Handle error 
      } 
      defer{ 
       dispatch_group_leave(workGroup) 
      } 
     } 
    } 

    dispatch_group_notify(workGroup, dispatch_get_main_queue()) {() -> Void in 
     do{ 
      try parentContext.save() 
     } 
     catch 
     { 
      //Handle error 
     } 
     //End of persist 
     completion() 
    } 
} 

這在兒童方面所創建的每個對象並保存它們,但考慮到考慮到這樣做了很多對象的效率不高,你可能要創建一個二維數組的JSON對象(例如,如果您有1000個對象,則將它們分塊爲10個100個對象的數組,並在10個子上下文中解析10個數組的異步)。

希望它有幫助。