#xcode #core-data
#xcode #core-data
Вопрос:
Код выглядит следующим образом (я изолировал его с помощью инструкций печати, ошибка возникает в этих строках):
let request = NSFetchRequest<Group>(entityName: "Group")
request.sortDescriptors = [NSSortDescriptor(key: "id", ascending: false)]
let groups = try! context.fetch(request)
Примечания (отредактировано):
- Хранилище резервных копий SQLite
- XCode 12.3
Я проверил основы, существует Group
объект с id
полем.
Даже если есть простое решение, также был бы очень благодарен за стратегию исправления ошибок здесь. Есть ли какой-нибудь способ, которым я могу прочитать документацию, чтобы разобраться в этом самостоятельно?
Полная трассировка стека:
2020-12-31 08:01:35.180433-0700 Things[25892:958568] -[__NSConcreteUUID compare:]: unrecognized selector sent to instance 0x60000367a9e0
2020-12-31 08:01:35.190552-0700 Things[25892:958568] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSConcreteUUID compare:]: unrecognized selector sent to instance 0x60000367a9e0'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff20420af6 __exceptionPreprocess 242
1 libobjc.A.dylib 0x00007fff20177e78 objc_exception_throw 48
2 CoreFoundation 0x00007fff2042f6f7 [NSObject(NSObject) instanceMethodSignatureForSelector:] 0
3 CoreFoundation 0x00007fff20425036 ___forwarding___ 1489
4 CoreFoundation 0x00007fff20427068 _CF_forwarding_prep_0 120
5 Foundation 0x00007fff2084132b _NSCompareObject 46
6 CoreFoundation 0x00007fff203aa09d __CFSimpleMergeSort 74
7 CoreFoundation 0x00007fff203aa133 __CFSimpleMergeSort 224
8 CoreFoundation 0x00007fff203a9c4a CFSortIndexes 395
9 CoreFoundation 0x00007fff203aa5f6 CFMergeSortArray 288
10 Foundation 0x00007fff208419d1 _sortedObjectsUsingDescriptors 558
11 Foundation 0x00007fff20841bbe -[NSArray(NSKeyValueSorting) sortedArrayUsingDescriptors:] 232
12 CoreData 0x00007fff25113c7e -[NSManagedObjectContext executeFetchRequest:error:] 4353
13 libswiftCoreData.dylib 0x00007fff54a88993 $sSo22NSManagedObjectContextC8CoreDataE5fetchySayxGSo14NSFetchRequestCyxGKSo0gH6ResultRzlF 51
14 Things 0x00000001048b7bdf $s6Things5GroupC6getAll7contextSayACGSo22NSManagedObjectContextC_tFZ 591
15 Things 0x0000000104872da7 $s6Things16thingDataToThing2td7contextAA0E0CAA0eC0V_So22NSManagedObjectContextCtF 1399
16 Things 0x00000001048836e5 $s6Things9APIServerC14syncWithRemote7context8callbackySo22NSManagedObjectContextC_yyctF14completionBothL_10groupDatas05thingN0ySayAA9GroupDataVG_SayAA05ThingQ0VGtF0O6MapperL_2tdAA0R0CAP_tF 37
17 Things 0x0000000104883908 $s6Things9ThingDataVAA0B0Cs5Error_pIggozo_AcEsAF_pIegnrzo_TR 56
18 Things 0x000000010488b034 $s6Things9ThingDataVAA0B0Cs5Error_pIggozo_AcEsAF_pIegnrzo_TRTA 20
19 libswiftCore.dylib 0x00007fff2f8edfe2 $sSlsE3mapySayqd__Gqd__7ElementQzKXEKlF 674
20 Things 0x000000010488313f $s6Things9APIServerC14syncWithRemote7context8callbackySo22NSManagedObjectContextC_yyctF14completionBothL_10groupDatas05thingN0ySayAA9GroupDataVG_SayAA05ThingQ0VGtF 3855
21 Things 0x0000000104883b0c $s6Things9APIServerC14syncWithRemote7context8callbackySo22NSManagedObjectContextC_yyctF16completionGroupsL_10groupDatasySayAA9GroupDataVG_tF0kA0L_05thingN0ySayAA05ThingP0VG_tF 108
22 Things 0x000000010488207f $sSay6Things9ThingDataVGIegg_ADIegn_TR 15
23 Things 0x000000010487ecfc $s6Things9APIServerC7request3url15queryParameters6parser0C6Method10completion12errorHandler12httpBodyJsonySS_SDyS2SGx10Foundation4DataVcAA11RequestTypeOyxcySScAOSgtlFyAR_So13NSURLResponseCSgs5Error_pSgtcfU_yycfU_ 348
24 Things 0x000000010488b463 $s6Things9APIServerC7request3url15queryParameters6parser0C6Method10completion12errorHandler12httpBodyJsonySS_SDyS2SGx10Foundation4DataVcAA11RequestTypeOyxcySScAOSgtlFyAR_So13NSURLResponseCSgs5Error_pSgtcfU_yycfU_TA 51
25 Things 0x000000010487ed70 $sIeg_IeyB_TR 48
26 libdispatch.dylib 0x0000000104c2d7ec _dispatch_call_block_and_release 12
27 libdispatch.dylib 0x0000000104c2e9c8 _dispatch_client_callout 8
28 libdispatch.dylib 0x0000000104c3ce75 _dispatch_main_queue_callback_4CF 1152
29 CoreFoundation 0x00007fff2038edbb __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ 9
30 CoreFoundation 0x00007fff2038963e __CFRunLoopRun 2685
31 CoreFoundation 0x00007fff203886d6 CFRunLoopRunSpecific 567
32 GraphicsServices 0x00007fff2bededb3 GSEventRunModal 139
33 UIKitCore 0x00007fff24690e0b -[UIApplication _run] 912
34 UIKitCore 0x00007fff24695cbc UIApplicationMain 101
35 libswiftUIKit.dylib 0x00007fff54d1e5f2 $s5UIKit17UIApplicationMainys5Int32VAD_SpySpys4Int8VGGSgSSSgAJtF 98
36 Things 0x000000010489497a $sSo21UIApplicationDelegateP5UIKitE4mainyyFZ 122
37 Things 0x00000001048948ee $s6Things11AppDelegateC5$mainyyFZ 46
38 Things 0x00000001048949c9 main 41
39 libdyld.dylib 0x00007fff202593e9 start 1
)
libc abi.dylib: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSConcreteUUID compare:]: unrecognized selector sent to instance 0x60000367a9e0'
terminating with uncaught exception of type NSException
CoreSimulator 732.18.6 - Device: iPhone 11 (93AB6812-3722-4022-B989-2E1423E6E6D0) - Runtime: iOS 14.3 (18C61) - DeviceType: iPhone 11
Комментарии:
1. Из интереса, используете ли вы хранилище резервных копий SQLite?
2. Да, отредактировано соответствующим образом
3. Прочитайте сообщение об ошибке, оно довольно четкое: Вы собираетесь отсортировать
id
атрибут, который определен какNSUUID
. Однако этот класс не сопоставим (не отвечаетcompare:
).4. @vadian Спасибо! Это помогло — переключившись на сортировку по свойству string, ошибка исчезла. Я думаю, это трудно интерпретировать для новичков Swift, потому что я ожидаю, что компилятор поймает что-то подобное, но он не может вывести это, потому что это происходит не только внутри Swift. Очень рад принять в качестве ответа
Ответ №1:
Сортировка по полям UUID обычно не поддерживается Core Data. Чтобы заставить его работать, измените путь к ключу на строковый тип, например:
[NSSortDescriptor(key: "id.description", ascending: false)]
Теоретически путь к ключу id.uuidString
был бы лучше, но это все равно приводит к тому же сбою, что и в исходном вопросе (по крайней мере, в macOS 11).
Комментарии:
1. Хорошее решение, но описание может меняться со временем / выпусками. Возможно
id.uuidString
, это лучший выбор.2. @WarrenBurton Я пробовал это, но
uuidString
сбой в macOS 11.