J'ai un modèle de données de base avec quelques attributs transformables. Lorsque j'essaie de récupérer une entité du magasin, j'obtiens un avertissement
'NSKeyedUnarchiveFromData' should not be used to for un-archiving and will be removed in a future release
Je comprends ce que cela signifie - nous sommes censés utiliser un transformateur de valeur qui utilise la fonction NSSecureCoding
pour coder et décoder l'attribut. Le problème est que, pour autant que je puisse en juger, je am en utilisant un transformateur de valeur de codage sécurisé. J'ai quatre attributs transformables dans cette entité. Deux d'entre eux utilisent un transformateur nommé NSSecureUnarchiveFromData
. Les deux autres utilisent des transformateurs personnalisés qui sont enregistrés auprès de ValueTransformer.setValueTransformer(_:forName:)
.
J'ai placé un point d'arrêt sur +[NSKeyedUnarchiver unarchiveObjectWithData:]
et bien sûr, j'ai touché le point d'arrêt lorsque j'ai essayé de récupérer l'entité. La trace de la pile est la suivante
* 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
Mes questions :
- Dans quelles circonstances Core Data reviendrait-il au décodeur non sécurisé alors que tous les attributs transformables de cette entité ont spécifiquement défini le nom du transformateur ?
- Comment puis-je déboguer ce problème ?
Note : J'ai également vérifié toutes les autres entités de ce modèle pour m'assurer que leurs attributs transformables ont spécifiquement défini un transformateur sécurisé, juste au cas où cela serait dû à une relation défectueuse.