在Xcode预览中发生如下报错:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An instance of NSFetchedResultsController requires a fetch request with sort descriptors'
*** First throw call stack:
(0x194e94f20 0x18cd3b2b8 0x19cfceddc 0x1996b40b4 0x1996b3a88 0x1996b35c4 0x19a3dbefc 0x19a3dc35c
// ....
0x199004860 0x19901061c 0x102528ed4 0x102528fd4 0x1b863b154)
libc++abi: terminating due to uncaught exception of type NSException
这一问题的原因在于:NSFtchedResultsController 实例时,提供的 NSFetchRequest 没有指定 sort descriptors(排序条件),而 NSFetchedResultsController 是强制要求有排序条件的。
排查原因
经过排查发现,问题代码为:
@FetchRequest(
fetchRequest: {
let request = NSFetchRequest<YahooGoldPrice>(entityName: "YahooGoldPrice")
return request
}()
) var goldPrices: FetchedResults<YahooGoldPrice>
在这段代码中,由于 NSFetchedResultsController(或 SwiftUI 的 @FetchRequest 包装器)使用的 NSFetchRequest 没有设置 sortDescriptors,因此导致Xcode预览崩溃。
解决方案
给 NSFetchRequest 加上一个排序描述符,例如按时间倒序排序:
@FetchRequest(
fetchRequest: {
let request = NSFetchRequest<YahooGoldPrice>(entityName: "YahooGoldPrice")
request.sortDescriptors = [NSSortDescriptor(key: "updateTime", ascending: false)]
return request
}()
) var goldPrices: FetchedResults<YahooGoldPrice>
注意事项
sortDescriptors 必须至少有一个。
排序字段(如 “updateTime”)必须是 Core Data YahooGoldPrice 实体中存在的属性。