在我的應用程序中,我使用了一個類(比如說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()
}
}
})
謝謝jrturton,我打電話給多個WebService API,我將這些響應存儲在CoreData中。最初我沒有使用任何子上下文對象。我用過appDelegate.managedObjectContext。它工作正常,但有時應用程序崩潰說,像referenceData64,無效的參數錯誤一些錯誤。我GOOGLE了它,並發現由於併發問題發生此錯誤。這就是爲什麼我去與兒童上下文方法, – Sridhar
現在你已經添加了該代碼會發生什麼? – jrturton