繁体   English   中英

核心数据NSManagedObjectContext与NSMergePolicyType - 崩溃

[英]core data NSManagedObjectContext with NSMergePolicyType - Crash

我为我的上下文添加了NSMergePolicyType,但每次我发生冲突时,应用程序都会崩溃。

我在xcdatamodeld中添加了对表的约束(带有“id”) 在此输入图像描述

这是我的背景:

lazy var managedObjectContext: NSManagedObjectContext? =
    {
        // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
        let coordinator = self.persistentStoreCoordinator
        if coordinator == nil {
            return nil
        }
        var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType)
        managedObjectContext.persistentStoreCoordinator = coordinator
        managedObjectContext.mergePolicy = NSMergePolicyType.overwriteMergePolicyType
        return managedObjectContext
    }()

这就是保存:

func saveContext(onSuccess: (() -> Void)?) {
        if let moc = self.managedObjectContext {
            moc.perform {
                if moc.hasChanges {
                    do {
                        try moc.save()
                        onSuccess?()
                    } catch {
                        print("SaveContext error \(error)")
                    }
                }
            }
        }

但是当我与id发生冲突时,应用程序就会崩溃

  • 在创建的第一个实体上,一切都有效
  • 但是当我添加具有相同ID的实体时,应用程序崩溃了。

错误:

-[_SwiftValue resolveConflicts:error:]: unrecognized selector sent to instance 0x1d0256680

核心数据日志:

CoreData: annotation: sql connection fetch time: 0.0001s
CoreData: annotation: total fetch execution time: 0.0001s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 
0xd000000000080004 <x-coredata://E7F35452-965D-460D-AAFE-
5ED17B8E0174/DatapulseEntity/p2>
CoreData: sql: SELECT t0.Z_ENT, t0.Z_PK, t0.Z_OPT, t0.ZCREATEDTIME, 
t0.ZDELETEDTIME, t0.ZDESCRIPTION_VALUE, t0.ZID, t0.ZIS_MY_FAVORITE, 
t0.ZIS_SELF_LIKED, t0.ZIS_SELF_SAVED_OFFLINE, t0.ZIS_SELF_VIEWED, 
t0.ZIS_SHARED, t0.ZLIKES, t0.ZNAME, t0.ZPARENT_ID, t0.ZTHUMBNAIL, 
t0.ZTYPE, t0.ZUPDATEDTIME, t0.ZVIEWS, t0.ZLINKS, t0.ZREFRESHRATE FROM ZKNOWLEDGEBASEENTITY t0 WHERE  t0.Z_PK = ? 
CoreData: annotation: sql connection fetch time: 0.0000s
CoreData: annotation: total fetch execution time: 0.0000s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 
0xd000000000040004 <x-coredata://E7F35452-965D-460D-AAFE-5ED17B8E0174/KnowledgeBaseEntity/p1>
2018-02-04 16:18:30.149318+0200[49571:18233278] -[_SwiftValue resolveConflicts:error:]: unrecognized selector sent to instance 0x1d0256680

Everting正在寻找,只有当我有一个id冲突时才会崩溃。 (试试iphone 8,ios 11.2)

发现问题:

mergePolicy是一种“Any”类型,这意味着您可以插入任何错误的对象。

但是 mergePolicy必须获取mergePolicy对象,任何其他对象都会导致系统崩溃。

我所做的是传递mergePolicyType而不是对象。

崩溃!:

managedObjectContext.mergePolicy = NSMergePolicyType.overwriteMergePolicyType

工作:

managedObjectContext.mergePolicy = NSMergePolicy(merge: NSMergePolicyType.overwriteMergePolicyType)

工作还:

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM