在 Swift 中同时保存在 CoreData 中时,应用程序崩溃



应用程序在核心数据中保存时崩溃

do {
try context.save()  <-----------  CRASH ---------
} catch {
print("Failed saving")
}

我使用此代码将数据保存在后台的核心数据中

DispatchQueue.global(qos: .background).async {
// Fetches from database                
DispatchQueue.main.async {
if fetchedActivitiesFromDB {
// Updates the view
} else {
// gets from the server
// Save the result in Core Data <------------
let coreData = CoreDataHelper()
coreData.saveInDB(fetchedItemsFromServer)
}
}                 
} 

根据上面的代码,这可以同时保存在CoreData中。
我做了一些任务来解决问题,但它们不起作用。

首先:我想创建一个队列来处理并发保存

let saveQueue = DispatchQueue(label: "start save in CoreData");
saveQueue.async {
DispatchQueue.global(qos: .background).async{
do {
try context.save()
} catch {
print("Failed saving")
}
}
}

上面的代码没有解决问题。

第二:CoreDataManager不是单例。我认为这是问题所在,所以我将其更改为:

class CoreDataHelper {
static let sharedInstance = CoreDataHelper()
private init() {}
static func getInstance() ->  CoreDataHelper {
return sharedInstance
}
//...
}

第三:我更改了核心数据堆栈设置

static var managedObjectContext: NSManagedObjectContext = {
let coordinator = persistentStoreCoordinator
var managedObjectContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()

ConcurrencyType 曾经是mainQueueConcurrencyType

这些更改都没有解决问题

崩溃细节:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber length]: unrecognized selector sent to instance 0xb000000000014153'
*** First throw call stack:
(0x18485cf48 0x19940ff80 0x184863c5c 0x184860c00 0x184764cac 0x18482c978 0x18476de38 0x18460f134 0x1845ebda0 0x1845ed47c 0x18453f2fc 0x184509f04 0x1845d0fdc 0x1845d8fd8 0x1025b5c68 0x1025c181c 0x1845cb830 0x184509ab0 0x18452e1d8 0x1005bce00 0x10029e498 0x100484a08 0x1003c097c 0x1003ca13c 0x1001296e8 0x1025b5ca8 0x1025b5c68 0x1025bb710 0x1848141f8 0x184812060 0x184740ca0 0x18f97c088 0x189e58ffc 0x10011c8e0 0x199c5e8b8)
libc++abi.dylib: terminating with uncaught exception of type NSException
import UIKit
import CoreData
class CoreDataHandler: NSObject {

func getContext() -> NSManagedObjectContext{
let appdelegate = UIApplication.shared.delegate as! AppDelegate
return appdelegate.persistentContainer.viewContext
}
func saveDataToCoreData(username:String,password:String) -> Bool{
let entity = NSEntityDescription.entity(forEntityName:"Entity", in: getContext())
let manageObect = NSManagedObject(entity: entity!, insertInto: getContext())
manageObect.setValue(username,forKey:password)
do{
try getContext().save()
return true
}
catch{
return false
}
}
func fetchAllData() -> [Entity]?{
do{
let result:[Entity]? = try getContext().fetch(Entity.fetchRequest())
return result
}
catch{
return nil
}
}
func delete(ManagedObj:Entity) -> Bool{
getContext().delete(ManagedObj)
do{
try getContext().save()
return true
}
catch{
return false
}

}
func cleanMyCoreData() -> Bool{
let delete = NSBatchDeleteRequest(fetchRequest:Entity.fetchRequest())
do{
try getContext().execute(delete)
return true
}
catch{
return false
}
}
func filterByPredicate(pred:NSPredicate) -> [Entity]?{
let fetchReq:NSFetchRequest<Entity> = Entity.fetchRequest()
fetchReq.predicate = pred
do{
let entity =   try getContext().fetch(fetchReq)
return entity
}
catch{
return nil
}

}

}

相关内容

最新更新