当使用in 的UUID属性时,应用程序会崩溃:NSManagedObjectNSFetchedResultsController
-[__NSConcreteUUID compare:]:无法识别的选择器发送到实例
当内容NSFetchedResultsController.fetchedObjects改变时,而不是在第一次加载时。首次加载时,对象按 UUID 正确排序。
这就是我创建的方式NSFetchedResultsController:
let fetchRequest: NSFetchRequest<MyObject> = MyObject.fetchRequest()
fetchRequest.sortDescriptors = [
NSSortDescriptor(key: #keyPath(MyObject.uuid), ascending: true),
]
fetchRequest.predicate = NSPredicate(format: "%K == %@", #keyPath(MyObject.tag), tag)
let controller = NSFetchedResultsController(fetchRequest: fetchRequest,
managedObjectContext: context,
sectionNameKeyPath: nil,
cacheName: nil)
controller.delegate = self
do {
try controller.performFetch()
} catch {
fatalError("###\(#function): Failed to performFetch: \(error)")
}
为了创建NSManagedObject(MyObject在上面的代码中),我使用模型编辑器添加了一个带有UUID类型的字段“uuid”。
看起来Core Data在SQL级别按UUID排序没有问题,但是在加载数据并尝试在内存中保持排序之后,它尝试以某种方式调用compareon _NSConcreteUUID,这作为方法不存在。此方法可以通过 UUID 的字节或字符串比较来实现。
失败的尝试:
compare作为扩展添加到UUID或NSUUID- Core Data 不允许将
comparator参数传递给,并将终止应用程序NSSortDescriptor
也许有一种解决方法Transformable,可以让它从 SQL 端的本机 UUID 类型中受益,但仍然可以在内部使用NSFetchedResultsController?