Ios 带有自定义NSSortDescriptor的NSFetchedResultsController

Ios 带有自定义NSSortDescriptor的NSFetchedResultsController,ios,core-data,nssortdescriptor,Ios,Core Data,Nssortdescriptor,我有一个Person对象,其中包含firstName、lastName和类别(字符串) 我想创建一个NSSortDescriptor,它允许我获取所有按“category”排序的Person,然后按firstName排序 示例: 所需的顺序如下所示: 潜在客户、潜在客户、总承包商、总承包商。 然后,在类别中,它们必须按字母顺序排列(lastName,firstName) 我尝试使用NSSortDescriptor(键:,升序:,比较器:)但没有成功 下面是NSFetchRequest的我的代码

我有一个
Person
对象,其中包含
firstName
lastName
类别
(字符串)

我想创建一个
NSSortDescriptor
,它允许我获取所有按“
category
”排序的
Person
,然后按
firstName
排序

示例:

所需的顺序如下所示: 潜在客户、潜在客户、总承包商、总承包商。 然后,在类别中,它们必须按字母顺序排列(lastName,firstName)

我尝试使用
NSSortDescriptor(键:,升序:,比较器:)
但没有成功

下面是
NSFetchRequest的我的代码

let categoryDescriptor = NSSortDescriptor(key: "category", ascending: true) { (category1, category2) -> ComparisonResult in

    let arrayCategory = [PROSPECT, INATIVE_1Y, GC, VGC]

    let c1Index = arrayCategory.firstIndex(of: category1) ?? 0
    let c2Index = arrayCategory.firstIndex(of: category2) ?? 0

    if c1Index < c2Index {
        return .orderedAscending
    } else if c1Index > c2Index {
        return .orderedDescending
    }

    return .orderedSame
}
objectFetchRequest.sortDescriptors?.append(categoryDescriptor)


let lastNameSortDescriptor = NSSortDescriptor(key: "lastName", ascending: true)
objectFetchRequest.sortDescriptors?.append(lastNameSortDescriptor)


let firstNameSortDescriptor = NSSortDescriptor(key: "firstName", ascending: true)
objectFetchRequest.sortDescriptors?.append(firstNameSortDescriptor)
let categoryDescriptor=NSSortDescriptor(键:“category”,升序:true){(category1,category2)->比较中的结果
让arrayCategory=[PROSPECT,INATIVE_1Y,GC,VGC]
设c1Index=arrayCategory.firstIndex(属于:category1)??0
设c2Index=arrayCategory.firstIndex(属于:category2)??0
如果c1索引c2Index,则为else{
return.orderedDescending
}
退货。订购相同
}
objectFetchRequest.sortDescriptors?.append(categoryDescriptor)
让lastNameSortDescriptor=NSSortDescriptor(键:“lastName”,升序:true)
objectFetchRequest.sortDescriptors?.append(lastNameSortDescriptor)
让firstNameSortDescriptor=NSSortDescriptor(键:“firstName”,升序:true)
objectFetchRequest.sortDescriptors?.append(firstNameSortDescriptor)
应用程序崩溃:

CoreData: error: SQLCore dispatchRequest: exception handling request: <NSSQLFetchRequestContext: 0x600002e82a00> , unsupported NSSortDescriptor (comparator blocks are not supported) with userInfo of (null)
2019-11-05 20:05:59.779136+0200 APP NAME [45129:1204138] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unsupported NSSortDescriptor (comparator blocks are not supported)'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000110efa8db __exceptionPreprocess + 331
    1   libobjc.A.dylib                     0x000000010f99fac5 objc_exception_throw + 48
    2   CoreData                            0x00000001109ba53e -[NSSQLGenerator newSQLStatementForRequest:ignoreInheritance:countOnly:nestingLevel:nestIsWhereScoped:requestContext:] + 1646
    3   CoreData                            0x00000001109c4b0e -[NSSQLiteAdapter _statementForFetchRequestContext:ignoreInheritance:countOnly:nestingLevel:] + 142
    4   CoreData                            0x00000001108724c4 -[NSSQLiteAdapter newSelectStatementWithFetchRequestContext:ignoreInheritance:] + 116
    5   CoreData                            0x0000000110a0feb3 -[NSSQLFetchRequestContext _createStatement] + 67
    6   CoreData                            0x0000000110a0fe4e -[NSSQLFetchRequestContext fetchStatement] + 142
    7   CoreData                            0x0000000110a10e3b -[NSSQLFetchRequestContext executeRequestCore:] + 27
    8   CoreData                            0x0000000110a7a790 -[NSSQLStoreRequestContext executeRequestUsingConnection:] + 208
    9   CoreData                            0x0000000110a4f0eb __52-[NSSQLDefaultConnectionManager handleStoreRequest:]_block_invoke + 75
    10  libdispatch.dylib                   0x000000011271adb5 _dispatch_client_callout + 8
    11  libdispatch.dylib                   0x0000000112728d08 _dispatch_lane_barrier_sync_invoke_and_complete + 132
    12  CoreData                            0x0000000110a4efd0 -[NSSQLDefaultConnectionManager handleStoreRequest:] + 336
    13  CoreData                            0x0000000110a56c24 -[NSSQLCoreDispatchManager routeStoreRequest:] + 308
    14  CoreData                            0x000000011099f288 -[NSSQLCore dispatchRequest:withRetries:] + 232
    15  CoreData                            0x000000011099bffd -[NSSQLCore processFetchRequest:inContext:] + 93
    16  CoreData                            0x00000001108719ce -[NSSQLCore executeRequest:withContext:error:] + 574
    17  CoreData                            0x0000000110980657 __65-[NSPersistentStoreCoordinator executeRequest:withContext:error:]_block_invoke + 2039
    18  CoreData                            0x0000000110978870 -[NSPersistentStoreCoordinator _routeHeavyweightBlock:] + 288
    19  CoreData                            0x00000001108711a0 -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 1296
    20  CoreData                            0x000000011086f475 -[NSManagedObjectContext executeFetchRequest:error:] + 933
    21  CoreData                            0x0000000110a1f9c0 __43-[NSFetchedResultsController performFetch:]_block_invoke + 448
    22  CoreData                            0x000000011098d104 gutsOfBlockToNSPersistentStoreCoordinatorPerform + 212
    23  libdispatch.dylib                   0x000000011271adb5 _dispatch_client_callout + 8
    24  libdispatch.dylib                   0x0000000112728d08 _dispatch_lane_barrier_sync_invoke_and_complete + 132
    25  CoreData                            0x0000000110978146 -[NSPersistentStoreCoordinator performBlockAndWait:] + 198
    26  CoreData                            0x00000001108b2a2a developerSubmittedBlockToNSManagedObjectContextPerform + 170
    27  CoreData                            0x00000001108b28ff -[NSManagedObjectContext performBlockAndWait:] + 239
    28  CoreData                            0x0000000110a1fd11 -[NSFetchedResultsController _recursivePerformBlockAndWait:withContext:] + 145
    29  CoreData                            0x0000000110a1f72b -[NSFetchedResultsController performFetch:] + 299
    30  APP NAME                            0x0000000109f25278 $s20APP_NAME22GeneralFetchControllerC14refreshResultsyySSF + 1512
    31  APP NAME                            0x0000000109daca74 $s20APP_NAME19LocalClientSearchVCC14refreshResultsyySSF + 164
    32  APP NAME                            0x0000000109f24b8b $s20APP_NAME22GeneralFetchControllerC024initializeFetchedResultsG0yyF + 619
    33  APP NAME                            0x0000000109f247fa $s20APP_NAME22GeneralFetchControllerC11viewDidLoadyyFyycfU_ + 58
    34  APP NAME                            0x0000000109f2487d $s20APP_NAME22GeneralFetchControllerC11viewDidLoadyyFyycfU_TA + 13
    35  APP NAME                            0x0000000109c78c4d $sIeg_IeyB_TR + 45
    36  libdispatch.dylib                   0x0000000112719d7f _dispatch_call_block_and_release + 12
    37  libdispatch.dylib                   0x000000011271adb5 _dispatch_client_callout + 8
    38  libdispatch.dylib                   0x0000000112728080 _dispatch_main_queue_callback_4CF + 1540
    39  CoreFoundation                      0x0000000110e61a79 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    40  CoreFoundation                      0x0000000110e5c126 __CFRunLoopRun + 2310
    41  CoreFoundation                      0x0000000110e5b4d2 CFRunLoopRunSpecific + 626
    42  GraphicsServices                    0x00000001140b42fe GSEventRunModal + 65
    43  UIKitCore                           0x000000011a14ffc2 UIApplicationMain + 140
    44  APP NAME                            0x000000010a307ffb main + 75
    45  libdyld.dylib                       0x000000011278f541 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
CoreData:错误:SQLCore dispatchRequest:异常处理请求:,不支持的NSSortDescriptor(不支持比较程序块),userInfo为(null)
2019-11-05 20:05:59.779136+0200应用程序名称[45129:1204138]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因是:“不支持的NSSortDescriptor(不支持比较器块)”
***第一次抛出调用堆栈:
(
0 CoreFoundation 0x0000000110efa8db例外预处理+331
1 libobjc.A.dylib 0x000000010f99fac5 objc_异常_抛出+48
2 CoreData 0x00000001109ba53e-[NSSQLGenerator newSQLStatementForRequest:IgnoreInheritation:countOnly:nestingLevel:NestisWhereScope:requestContext:+1646
3 CoreData 0x00000001109c4b0e-[NSSQLiteAdapter\u语句ForFetchRequestContext:IgnoreInheritation:countOnly:nestingLevel:+142
4 CoreData 0x00000001108724c4-[NSSQLiteAdapter newSelectStatementWithFetchRequestContext:IgnoreInheritation:+116
5 CoreData 0x000000011A0FEB3-[NSSQLFetchRequestContext\u createStatement]+67
6 CoreData 0x000000011A0FE4E-[NSSQLFetchRequestContext fetchStatement]+142
7 CoreData 0x000000011010E3B-[NSSQLFetchRequestContext ExecuterRequestCore:+27
8 CoreData 0x00000001107A790-[NSSQLStoreRequestContext ExecuterRequestUsingConnection:+208
9 CoreData 0x0000000110A4 F0EB__52-[NSSQLDefaultConnectionManager handleStoreRequest:][U block_invoke+75
10 libdispatch.dylib 0x0000000111271ADB5 _dispatch_client_callout+8
11 libdispatch.dylib 0x0000000112728d08 _调度_车道_障碍_同步_调用_和_完成+132
12 CoreData 0x00000001104EFD0-[NSSQLDefaultConnectionManager handleStoreRequest:+336
13 CoreData 0x000000011056C24-[NSSQLCoreDispatchManager路由请求:+308
14 CoreData 0x000000011099f288-[NSSQLCore dispatchRequest:withRetries:][232
15 CoreData 0x000000011099bffd-[NSSQLCore processFetchRequest:inContext:+93
16 CoreData 0x00000001108719ce-[NSSQLCore executeRequest:withContext:error:+574
17 CoreData 0x0000000110980657 u 65-[NSPersistentStoreCoordinator executeRequest:withContext:error:][u block_invoke+2039
18核心数据0x0000000110978870-[NSPersistentStoreCoordinator\u routeHeavyweightBlock:+288
19 CoreData 0x00000001108711a0-[NSPersistentStoreCoordinator executeRequest:withContext:error:+1296
20 CoreData 0x000000011086f475-[NSManagedObjectContext executeFetchRequest:错误:][933
21 CoreData 0x0000000110a1f9c0\uU43-[NSFETCHEEDRESULTSCONTROLLER performFetch:]块调用+448
22 CoreData 0x000000011098d104块体槽口存储协调器性能+212
23 libdispatch.dylib 0x0000000111271ADB5 _dispatch_client_callout+8
24 libdispatch.dylib 0x0000000112728d08 _调度_车道_障碍_同步_调用_和_完成+132
25核心数据0x0000000110978146-[NSPersistentStoreCoordinator performBlockAndWait:+198
26 CoreData 0x00000001108b2a2a开发人员SubmittedBlocktonsManagedObjectContextPerform+170
27 CoreData 0x00000001108b28ff-[NSManagedObjectContext performBlockAndWait:+239
28 CoreData 0x0000000110a1fd11-[NSFetchedResultsController\u递归执行锁和等待:withContext:+145
29 CoreData 0x0000000110a1f72b-[NSFetchedResultsController性能测试:+299
30应用程序名称0x0000000109f25278$s20APP_名称22通用蚀刻控制器14刷新结果YYSSF+1512
31应用程序名称0x0000000109daca74$s20APP_名称19LocalClientSearchVCC14RefreshResultsYYSSF+164
32应用程序名称
var categoryIndex : Int {
   switch category {
      case "PROSPECT": return 0
      case "INATIVE_1Y": return 1
      case "GC": return 2 
      case "VGC": return 3
      default: fatalError("category not available")
   }
}