ios - 如何确定哪个 Core Data 可转换属性未使用安全编码

标签 ios swift core-data

我有一个带有一些可转换属性的核心数据模型。当我尝试从商店获取实体时,我收到警告

“NSKeyedUnarchiveFromData”不应用于取消存档,并将在未来版本中删除

我明白这意味着什么 - 我们应该使用一个值转换器,它使用 NSSecureCoding 来编码和解码属性。问题是,据我所知,我正在使用安全编码值转换器。我在这个实体中有四个可变形的属性。其中两个使用名为 NSSecureUnarchiveFromData 的转换器。另外两个使用通过 ValueTransformer.setValueTransformer(_:forName:) 注册的自定义转换器。

我在 +[NSKeyedUnarchiver unarchiveObjectWithData:] 上设置了一个断点,果然,当我尝试获取实体时,我遇到了断点。堆栈跟踪是

  * frame #0: 0x00007fff207e4abf Foundation`+[NSKeyedUnarchiver unarchiveObjectWithData:]
    frame #1: 0x00007fff2516b4ef CoreData`+[_PFRoutines retainedDecodeValue:forTransformableAttribute:] + 58
    frame #2: 0x00007fff250fdf78 CoreData`_prepareResultsFromResultSet + 2535
    frame #3: 0x00007fff250fbddf CoreData`newFetchedRowsForFetchPlan_MT + 2095
    frame #4: 0x00007fff253486f1 CoreData`_executeFetchRequest + 55
    frame #5: 0x00007fff2529b56a CoreData`-[NSSQLFetchRequestContext executeRequestCore:] + 41
    frame #6: 0x00007fff25310b4e CoreData`-[NSSQLStoreRequestContext executeRequestUsingConnection:] + 405
    frame #7: 0x00007fff252e28cb CoreData`__52-[NSSQLDefaultConnectionManager handleStoreRequest:]_block_invoke + 56
    frame #8: 0x00007fff2524b3c1 CoreData`__37-[NSSQLiteConnection performAndWait:]_block_invoke + 28
    frame #9: 0x0000000108ee6a88 libdispatch.dylib`_dispatch_client_callout + 8
    frame #10: 0x0000000108ef5cac libdispatch.dylib`_dispatch_lane_barrier_sync_invoke_and_complete + 132
    frame #11: 0x00007fff2524b2a7 CoreData`-[NSSQLiteConnection performAndWait:] + 134
    frame #12: 0x00007fff252e27e0 CoreData`-[NSSQLDefaultConnectionManager handleStoreRequest:] + 273
    frame #13: 0x00007fff252e9214 CoreData`-[NSSQLCoreDispatchManager routeStoreRequest:] + 283
    frame #14: 0x00007fff2521a994 CoreData`-[NSSQLCore dispatchRequest:withRetries:] + 161
    frame #15: 0x00007fff25215f2e CoreData`-[NSSQLCore processFetchRequest:inContext:] + 88
    frame #16: 0x00007fff250eaf31 CoreData`-[NSSQLCore executeRequest:withContext:error:] + 1072
    frame #17: 0x00007fff251f50a2 CoreData`__65-[NSPersistentStoreCoordinator executeRequest:withContext:error:]_block_invoke.797 + 3219
    frame #18: 0x00007fff251ed772 CoreData`-[NSPersistentStoreCoordinator _routeHeavyweightBlock:] + 222
    frame #19: 0x00007fff250ea40e CoreData`-[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 1684
    frame #20: 0x00007fff250e89c2 CoreData`-[NSManagedObjectContext executeFetchRequest:error:] + 885
    frame #21: 0x00007fff539b2903 libswiftCoreData.dylib`(extension in CoreData):__C.NSManagedObjectContext.fetch<A where A: __C.NSFetchRequestResult>(__C.NSFetchRequest<A>) throws -> Swift.Array<A> + 51
    frame #22: 0x0000000106bbd7c8 TouchpointLibrary`static TPLibrary.fetchLibrary(moc=0x00006000007dc750, self=TouchpointLibrary.TPLibrary) at TPLibrary+CoreDataClass.swift:26:29

我的问题:

  1. 在什么情况下,即使该实体中的所有可转换属性都专门设置了转换器名称,核心数据也会回退到不安全的解码器?
  2. 如何进一步调试?

注意:我还仔细检查了该模型中的所有其他实体,以确保它们的可转换属性已专门设置安全转换器,以防万一这是由于关系出现故障而导致的。

最佳答案

根据评论中的建议,我设置了 propertiesToFetch 来隔离问题。我正在使用我在评论 https://stackoverflow.com/a/58528937/212649 中描述的技术,到目前为止,这对我来说效果很好。但是,当要转换的对象在不同的​​模块中声明时,自动生成的转换器名称包括模块名称,该名称与我在核心数据模型中使用的名称不匹配。

不幸的是,iOS 不会给出任何关于找不到您指定名称的转换器的警告,而是只是默默地退回到不安全的解码。如果它记录了这一点,我就会花更少的时间来解决这个问题。

关于ios - 如何确定哪个 Core Data 可转换属性未使用安全编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64583182/

相关文章:

json - 使用 NSJSONSerialization 从 json 响应构建对象

ios - 你如何构造 NSFetchRequest setHavingPredicate :? 的谓词

ios - 如何为Application Loader创建上传文件?

ios - UITableview:无法从其数据源获取单元格

ios - AFNetworking POST 错误 3840

ios - iOS中如何实现长振动

ios - 用于室内导航的 map 编辑器

swift - 在停用 subview 的约束后对 tableviewcell 进行动画处理

ios - 我应该在 iOS 应用程序中将图像保存到本地存储吗?

ios - Swift:对特定对象 ID 的 CoreData 调用