2016-07-26 14 views
8

In meiner Anwendung habe ich eine Klasse (zB CoredataHandler.swift) zum Speichern und Abrufen von Objekten verwendet. Ich habe this tutorials verfolgt. Ich habe verwendet Strategie 2: Parent/Child Managed Object Contexts. Objekte werden jedoch nicht in den Coredata gespeichert. Anstatt NSOperation zu verwenden, habe ich ein normales Klassenobjekt verwendet.iOS: Swift: CoreData: Werte werden nicht mit PrivateManagedObjectContext gespeichert

class CoreDataHandler: NSObject { 

//static var sharedInstance:CoreDataHandler = CoreDataHandler() 

var privateManagedObjectContext:NSManagedObjectContext? 
var mainManagedObjectContext:NSManagedObjectContext? 


override init() { 

    print("core data handler constructor called") 
    super.init() 

    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let privateManagedObjectContextlocal = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) 
    privateManagedObjectContextlocal.parentContext = appDelegate.managedObjectContext 

    self.privateManagedObjectContext = privateManagedObjectContextlocal 

    self.mainManagedObjectContext = appDelegate.managedObjectContext 

    let notificationCenter = NSNotificationCenter.defaultCenter() 
    notificationCenter.addObserver(self, selector: #selector(CoreDataHandler.managedObjectContextDidSave(_:)), name: NSManagedObjectContextDidSaveNotification, object: privateManagedObjectContext) 
} 

private func insertData(entityName:String,dataDictionary:Dictionary<String, AnyObject?>){ 
    synced(self) {() ->() in 

     //  let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

     let entityDescription = NSEntityDescription.entityForName(entityName, inManagedObjectContext: self.privateManagedObjectContext!) 

     let newPerson = NSManagedObject(entity: entityDescription!, insertIntoManagedObjectContext: self.privateManagedObjectContext!) 

     for (myKey, myVal) in dataDictionary { 

      if myVal is Int { 

       if let result_number = myVal as? NSNumber 
       { 
        let result_string = "\(result_number)" 
        newPerson.setValue(result_string, forKey: myKey) 

       } 


      }else{ 
       newPerson.setValue(myVal, forKey: myKey) 

      } 

     } 

     //print("insertData",newPerson) 

     do { 
      if ((self.privateManagedObjectContext?.hasChanges) != nil){ 

       try self.privateManagedObjectContext!.save() 
      } 



     } catch { 

      // Replace this implementation with code to handle the error appropriately. 

      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 

      let nserror = error as NSError 

      NSLog("Unresolved error \(nserror), \(nserror.userInfo)") 

      abort() 

     } 
    } 
} 

// MARK: - Insert 

func insertOfferObjects(arrOffer : Array<FoodItem>?) { 
    synced(self) {() ->() in 


     //Step1: Adding Offer Items 
     if let _ = arrOffer { 
      var foodArr:Array<NSManagedObject> = Array() 

      for foodObj : FoodItem in arrOffer! { 

       let offerItemEntity = self.createFoodItemEntity(foodObj) 
       foodArr.append(offerItemEntity) 

      } 

      self.insertData("OfferCategory", dataDictionary: ["categoryTitle": "Offers", "foodItemArray": NSOrderedSet(array: foodArr)]) 

     } 
    } 
} 

Werte werden nicht in den Coredata gespeichert. Bitte gib mir den besten Weg.

EDITED: Update :: Von Antworten, benötigen Eltern zu speichern, wenn Kind Kontext gespeichert

  self.privateManagedObjectContext?.performBlockAndWait({ 

       if ((self.privateManagedObjectContext?.hasChanges) != nil){ 

        do { 

         print("It has changes...............") 

         try self.privateManagedObjectContext!.save() 

         self.mainManagedObjectContext?.performBlock({ 
          do { 
          try self.mainManagedObjectContext!.save() 
          }catch{ 

          } 
         }) 

        }catch { 

         // Replace this implementation with code to handle the error appropriately. 

         // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 

         let nserror = error as NSError 

         NSLog("Unresolved error \(nserror), \(nserror.userInfo)") 

         abort() 

        } 

       } 
      }) 

Antwort

5

ein Kind Kontext Speichern drückt nur diese Änderungen an den übergeordneten Kontext. Sofern Sie nicht auch den übergeordneten Kontext speichern (der Änderungen an den persistenten Speicher überträgt), werden Ihre Änderungen nicht auf den Datenträger geschrieben.

Vom NSManagedObjectContext Klassenreferenz:

Wenn Sie Änderungen in einem Kontext speichern, werden die Änderungen nur verpflichtet „ein Geschäft up“ Wenn Sie ein Kind Kontext speichern, werden Änderungen gedrängt an ihre Mutter. Änderungen werden nicht im permanenten Speicher gespeichert, bis der Stammkontext gespeichert wird. (A Wurzel verwaltete Objektkontext ist einer, dessen Elternkontext ist gleich Null.)

Wenn Sie auf Kerndaten neu sind, würde ich vorschlagen, nicht sich Gedanken über Gleichzeitigkeit und mehrere Kontexte, wenn Sie tatsächlich ein Problem, das das erfordert um es zu lösen. Wenn Sie nicht mit Tausenden von Datensätzen zu tun haben oder wenn Sie daran interessiert sind, Editierkontexte für reversible Änderungen zu erstellen, wird ein einziger Hauptthreadkontext alles tun, was Sie brauchen.

+0

Dank jrturton, ich rufe mehrere WebService APIs und ich speichere diese Antwort in den CoreData. Anfangs habe ich kein Kind-Kontextobjekt verwendet. Ich wurde appDelegate.managedObjectContext verwendet. Es funktionierte gut, aber manchmal App stürzte ab und sagte, dass ein Fehler wie referenceData64, ungültiger Argument Fehler. Ich habe es gegoogelt und festgestellt, dass dieser Fehler aufgrund von Nebenläufigkeit aufgetreten ist. Deshalb gehe ich mit Kind Kontext Methoden, – Sridhar

+0

Was passiert jetzt, dass Sie diesen Code hinzugefügt haben? – jrturton