Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否可以在NSFetchedResultsController的NSSortDescriptor中使用UUID?_Ios_Swift_Core Data_Nsfetchedresultscontroller_Nssortdescriptor - Fatal编程技术网

Ios 是否可以在NSFetchedResultsController的NSSortDescriptor中使用UUID?

Ios 是否可以在NSFetchedResultsController的NSSortDescriptor中使用UUID?,ios,swift,core-data,nsfetchedresultscontroller,nssortdescriptor,Ios,Swift,Core Data,Nsfetchedresultscontroller,Nssortdescriptor,在NSFetchedResultsController中使用NSManagedObject的UUID属性时,应用程序会因以下原因崩溃: -[\uu nsconcreteuid compare:]:发送到实例的选择器无法识别 当NSFetchedResultsController.fetchedObject的内容发生更改时,但不是在首次加载时。首次加载时,对象按UUID正确排序 这就是我如何创建NSFetchedResultsController的方法: let fetchRequest:NSFe

NSFetchedResultsController
中使用
NSManagedObject
UUID
属性时,应用程序会因以下原因崩溃:

-[\uu nsconcreteuid compare:]:发送到实例的选择器无法识别

NSFetchedResultsController.fetchedObject的内容发生更改时,但不是在首次加载时。首次加载时,对象按UUID正确排序

这就是我如何创建NSFetchedResultsController的方法:

let fetchRequest:NSFetchRequest=MyObject.fetchRequest()
fetchRequest.sortDescriptors=[
NSSortDescriptor(键:#键路径(MyObject.uuid),升序:true),
]
fetchRequest.predicate=NSPredicate(格式:“%K==%@”,#键路径(MyObject.tag),tag)
让控制器=NSFetchedResultsController(fetchRequest:fetchRequest,
managedObjectContext:context,
sectionNameKeyPath:nil,
缓存名称:nil)
controller.delegate=self
做{
尝试controller.performFetch()
}抓住{
fatalError(“####\(#函数):未能执行蚀刻:\(错误)”)
}
为了创建
NSManagedObject
MyObject
,在上面的代码中),我使用模型编辑器添加了一个带有
uuid
类型的字段“uuid”

核心数据在SQL级别按UUID排序似乎没有问题,但在加载数据并尝试在内存中维护排序后,它尝试以某种方式调用
\nsConcreteUid
上的
compare
,而这种方法并不存在。此方法可以通过UUID的字节或字符串比较来实现

失败的尝试:

  • 添加
    compare
    作为
    UUID
    nsuid
  • 核心数据不允许将
    comparator
    参数传递给
    NSSortDescriptor
    ,这将终止应用程序

也许有一种解决方法,可以使用
可转换的
,它可以从SQL端的本机UUID类型中获益,但仍然可以在
NSFetchedResultsController
中使用?

不,不可能使用
UUID
属性对核心数据结果进行排序。如果要将UUID用于排序,则需要将其转换为字符串

在获取时,核心数据实际上并不按UUID排序。如果通过向Xcode中的构建方案中的参数添加
-com.apple.CoreData.SQLDebug 4
来启用核心数据SQLite调试,则可以看到这一点。当您对数字属性(如时间戳)进行排序时,调试输出包括一个SQL
ORDER BY
子句

CoreData: sql: SELECT 0, t0.Z_PK FROM ZEVENT t0 ORDER BY t0.ZTIMESTAMP DESC
如果您尝试使用
UUID
属性,则没有
orderby
子句。核心数据只是忽略排序描述符。它不会崩溃,但也不会对结果进行排序

我不确定这是为什么,因为使用
sqlite3
命令行工具打开SQLite文件核心数据创建显示UUID属性表示为SQLite
BLOB
字段。SQLite可以对BLOB进行排序,即使这样做通常没有意义


我建议向苹果公司提交一个bug。我不知道他们会怎么想,但它绝对不应该忽略排序描述符,也不应该打印某种控制台消息。

也许你可以使用
uuistring
,然后进行比较。这有点离题,不过在字符串(36/24位)和二进制之间选择时,你的偏好是什么,说空间是一个可以忽略不计的因素?我会选择数据已经采用的任何格式,除非有令人信服的理由进行转换。如果你不是这个意思,问一个新问题,并详细解释。