在Swift中并发保存CoreData时应用程序崩溃

在Swift中并发保存CoreData时应用程序崩溃,swift,core-data,Swift,Core Data,保存核心数据时应用程序崩溃 do { try context.save() <----------- CRASH --------- } catch { print("Failed saving") } 上述代码没有解决问题。 Second:CoreDataManager不是singleton。我认为这就是问题所在,所以我将其改为: class CoreDataHelper { static let sharedInstance = CoreDataHelper

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

do {
   try context.save()  <-----------  CRASH ---------
} catch {
   print("Failed saving")
}
上述代码没有解决问题。

Second:CoreDataManager不是singleton。我认为这就是问题所在,所以我将其改为:

class CoreDataHelper {

    static let sharedInstance = CoreDataHelper()

    private init() {}

    static func getInstance() ->  CoreDataHelper {
        return sharedInstance
    }
    //...
}
第三个:我更改了CoreData堆栈设置

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

        return managedObjectContext
    }()
ConcurrencyType过去是mainQueueConcurrencyType

所有这些更改都没有解决问题

碰撞详细信息:

导入UIKit
导入CoreData
类CoreDataHandler:NSObject{
func getContext()->NSManagedObjectContext{
让appdelegate=UIApplication.shared.delegate为!appdelegate
返回appdelegate.persistentContainer.viewContext
}
func saveDataToCoreData(用户名:String,密码:String)->Bool{
让entity=NSEntityDescription.entity(在:getContext()中,名为“entity”)
让manageObect=NSManagedObject(entity:entity!,insertInto:getContext())
manageObect.setValue(用户名,forKey:password)
做{
尝试getContext().save()
返回真值
}
抓住{
返回错误
}
}
func fetchAllData()->[实体]{
做{
let result:[Entity]?=尝试getContext().fetch(Entity.fetchRequest())
返回结果
}
抓住{
归零
}
}
func delete(ManagedObj:Entity)->Bool{
getContext().delete(ManagedObj)
做{
尝试getContext().save()
返回真值
}
抓住{
返回错误
}
}
func cleanMyCoreData()->Bool{
let delete=NSBatchDeleteRequest(fetchRequest:Entity.fetchRequest())
做{
尝试getContext()。执行(删除)
返回真值
}
抓住{
返回错误
}
}
func filterByPredicate(pred:NSPredicate)->[实体]{
让fetchReq:NSFetchRequest=Entity.fetchRequest()
fetchReq.predicate=pred
做{
让entity=try getContext().fetch(fetchReq)
返回实体
}
抓住{
归零
}
}
}
导入UIKit
导入CoreData
类CoreDataHandler:NSObject{
func getContext()->NSManagedObjectContext{
让appdelegate=UIApplication.shared.delegate为!appdelegate
返回appdelegate.persistentContainer.viewContext
}
func saveDataToCoreData(用户名:String,密码:String)->Bool{
让entity=NSEntityDescription.entity(在:getContext()中,名为“entity”)
让manageObect=NSManagedObject(entity:entity!,insertInto:getContext())
manageObect.setValue(用户名,forKey:password)
做{
尝试getContext().save()
返回真值
}
抓住{
返回错误
}
}
func fetchAllData()->[实体]{
做{
let result:[Entity]?=尝试getContext().fetch(Entity.fetchRequest())
返回结果
}
抓住{
归零
}
}
func delete(ManagedObj:Entity)->Bool{
getContext().delete(ManagedObj)
做{
尝试getContext().save()
返回真值
}
抓住{
返回错误
}
}
func cleanMyCoreData()->Bool{
let delete=NSBatchDeleteRequest(fetchRequest:Entity.fetchRequest())
做{
尝试getContext()。执行(删除)
返回真值
}
抓住{
返回错误
}
}
func filterByPredicate(pred:NSPredicate)->[实体]{
让fetchReq:NSFetchRequest=Entity.fetchRequest()
fetchReq.predicate=pred
做{
让entity=try getContext().fetch(fetchReq)
返回实体
}
抓住{
归零
}
}
}

您能提供更多关于坠机的信息吗?CoreData在控制台中打印您有什么例外?@MarcelT谢谢,我在答案中添加了崩溃的详细信息。@FattanehTalebi从后台保存时,我也遇到了一些罕见的崩溃。你解决过这个问题吗?我现在尝试将
do{try context.save()}catch{…}
包装在
context.performAndWait
中,但我不确定这是否有帮助。您能提供有关崩溃的更多信息吗?CoreData在控制台中打印您有什么例外?@MarcelT谢谢,我在答案中添加了崩溃的详细信息。@FattanehTalebi从后台保存时,我也遇到了一些罕见的崩溃。你解决过这个问题吗?我现在尝试将
do{try context.save()}catch{…}
包装在
上下文中。performAndWait
,但我还不确定这是否有帮助。我想你需要解释一下你的答案。你能解释一下吗?我想你需要解释一下你的答案。你能解释一下吗
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
    }()
*** 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
        }


    }



}