2016-07-26 14 views
8

在我的應用程序中,我使用了一個類(比如說CoredataHandler.swift)來存儲和檢索對象。我跟着this tutorials。我已經使用了策略2:父/子管理對象上下文。 但對象不存儲在coredata中。我沒有使用NSOperation,而是使用普通的類對象。iOS:Swift:CoreData:不使用PrivateManagedObjectContext存儲值

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)]) 

     } 
    } 
} 

值不存儲在coredata中。請給我提供最好的方法。

編輯:更新::從答案,需要保存父當孩子方面 保存

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

        } 

       } 
      }) 

回答

5

保存孩子方面只是推動這些變化到父上下文。除非您還保存父上下文(將更改推送到持久性存儲),否則您的更改將不會寫入磁盤。

NSManagedObjectContext類參考:

當您保存在環境的變化,如果你挽救一個孩子的情況下更改只犯了「一個店了」,更改推到它的父。在保存根環境之前,更改不會保存到持久性存儲中。 (根管理對象上下文是其母公司背景是零。)

如果你是新的核心數據,我建議不擔心併發和多種環境,除非你確實有需要的問題解決它。除非您處理數千條記錄,或者您有興趣爲可逆變更創建編輯上下文,否則單個主線程上下文將執行您所需的一切。

+0

謝謝jrturton,我打電話給多個WebService API,我將這些響應存儲在CoreData中。最初我沒有使用任何子上下文對象。我用過appDelegate.managedObjectContext。它工作正常,但有時應用程序崩潰說,像referenceData64,無效的參數錯誤一些錯誤。我GOOGLE了它,並發現由於併發問題發生此錯誤。這就是爲什麼我去與兒童上下文方法, – Sridhar

+0

現在你已經添加了該代碼會發生什麼? – jrturton