2016-07-26 11 views
8

का उपयोग करके मान संग्रहीत नहीं किए जाते हैं मेरे आवेदन में मैंने ऑब्जेक्ट्स को संग्रहीत करने और पुनर्प्राप्त करने के लिए एक वर्ग (CoredataHandler.swift कहें) का उपयोग किया है। मैंने this tutorials का पालन किया है। मैंने रणनीति 2 का उपयोग किया है: अभिभावक/बाल प्रबंधित ऑब्जेक्ट संदर्भ। लेकिन ऑब्जेक्ट्स कोर्डाटा में संग्रहीत नहीं किया जाता है। NSOperation का उपयोग करने के बजाय मैंने सामान्य वर्ग ऑब्जेक्ट का उपयोग किया है।आईओएस: स्विफ्ट: कोरडाटा: प्राइवेटमैनेज ऑब्जेक्ट कॉन्टेक्स्ट

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

     } 
    } 
} 

मूल्यों को कोर्डटा में संग्रहीत नहीं किया जाता है। कृपया मुझे करने का सबसे अच्छा तरीका प्रदान करें।

संपादित: अद्यतन :: जवाब से, जब बच्चे संदर्भ

  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, मैं एकाधिक वेब सेवा एपीआई कॉल कर रहा हूं और मैं CoreData में उन प्रतिक्रियाओं को संग्रहीत कर रहा हूं। शुरू में मैंने किसी भी बच्चे संदर्भ वस्तु का उपयोग नहीं किया था। मैं appDelegate.managedObjectContext का उपयोग किया गया था। यह ठीक काम कर रहा था लेकिन कभी-कभी ऐप क्रैश हो जाता है कि कुछ त्रुटि जैसे DataData64, अमान्य तर्क त्रुटि। मैंने इसे गुमराह किया और पाया कि यह त्रुटि समवर्ती मुद्दे के कारण हुई। मैं बाल संदर्भ विधियों के साथ क्यों जाता हूं, – Sridhar

+0

अब क्या होता है कि आपने वह कोड जोड़ा है? – jrturton

संबंधित मुद्दे