2016-04-27 4 views
0

Angenommen, ich habe tausend Datensätze von der Web-Service-API und wenn ich diese Datensätze in Core-Daten in privateContext hinzufügen möchten. Wie kann ich es simultan und nicht linear machen?Simultane Inserts in CoreData in iOS

Kann ich mich so etwas wie dispatch_apply und laufen

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

gleichzeitig?

+0

Sie können dispatch_async, performBlock (in managedContext) verwenden. Speichern Sie den Kontext nicht jedes Mal, wenn Sie alle Einfügeoperationen abgeschlossen haben, führen Sie den Speicherkontext aus. –

+0

Meine Frage ist etwas anders .... Ich möchte simultan einfügen. Zum Beispiel möchte ich 100 Datensätze parallel in 10 verschiedenen Warteschlangen einfügen. –

+0

Von diesem Artikel (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Concurrency.html) scheint es, dass Sie für jede Warteschlange einen anderen privaten Warteschlangenkontext benötigen würden. Wenn Sie es zum Laufen bringen, frage ich mich, ob die zugrunde liegende Datenbank parallele Aktualisierungen erlaubt oder sie selbst serialisiert. –

Antwort

0

Try this:

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() 
    } 
} 

Dies schafft jedes Objekt in einem Kind Kontext und speichert sie, aber nehmen Sie in der Ansicht, dass diese von Objekten für eine Menge zu tun nicht effizient ist, Sie können einen 2D-Array erstellen von JSON-Objekten (zB wenn Sie 1000 Objekte haben, dann zerstückeln Sie diese zu 10 Arrays von 100 Objekten und parsen die 10 Arrays asynchron in 10 untergeordneten Kontexten).

Ich hoffe, es hilft.