我有一个具有一些可转换属性的核心数据模型。当我试图从商店取一个实体时,我会收到一个警告。
'NSKeyedUnarchiveFromData' should not be used to for un-archiving and will be removed in a future release
我理解这意味着什么-我们应该使用一个使用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
我的问题:
注意:我还反复检查了这个模型中的所有其他实体,以确保它们的可转换属性专门设置了一个安全转换器,以防这是由于关系出现故障。
发布于 2020-10-29 12:47:54
根据评论中的建议,我将propertiesToFetch
设置为隔离问题。我使用了我在这个注释https://stackoverflow.com/a/58528937/212649中描述的技术,到目前为止,它一直对我很好。但是,当要转换的对象在不同的模块中声明时,自动生成的转换器名称包含模块名,这与我在核心数据模型中使用的名称不匹配。
不幸的是,iOS没有给出任何关于不为您指定的名称找到转换器的警告,而只是默默地退回到不安全的解码中。如果它记录了这个,我会花更少的时间在这个问题上。
https://stackoverflow.com/questions/64583182
复制