[英]How to determine which Core Data transformable attribute is not using secure coding
我有一個帶有一些可轉換屬性的核心數據模型。 當我嘗試從商店中獲取實體時,我收到一條警告
'NSKeyedUnarchiveFromData' should not be used to for un-archiving and will be removed in a future release
我理解這意味着什么 - 我們應該使用一個使用NSSecureCoding
來編碼和解碼屬性的值轉換器。 問題是,據我所知道的,我使用的是安全的編碼值轉換。 我在這個實體中有四個可轉換的屬性。 其中兩個使用名為NSSecureUnarchiveFromData
的轉換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
我的問題:
注意:我還仔細檢查了這個模型中的所有其他實體,以確保它們的可轉換屬性已經專門設置了一個安全轉換器,以防萬一這是由於關系出錯。
根據評論中的建議,我設置了propertiesToFetch
來隔離問題。 我正在使用我在此評論中描述的技術https://stackoverflow.com/a/58528937/212649 ,到目前為止對我來說效果很好。 但是,當要轉換的對象在不同的模塊中聲明時,自動生成的轉換器名稱包括模塊名稱,這與我在核心數據模型中使用的名稱不匹配。
不幸的是,iOS 不會給出任何關於找不到您指定名稱的轉換器的警告,而是只是默默地退回到不安全的解碼。 如果它記錄了這個,我會花更少的時間來解決這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.