我希望根据参考项目的属性获取itmes。
就像我有一些盒子,所有盒子里面都有物品,我希望看到按标题(a,b,c,d,e)分类的盒子,但是首先是带有成品的盒子。
我尝试使用子查询但得不到正确的结果。
我想使用NSFetchResultController,因为在使用过程中会有更新。
let sortDescriptors = [
NSSortDescriptor(key: "( SUBQUERY(items,$item,$item.finished == 0).@count > 0 )", ascending: false),
NSSortDescriptor(key: "title", ascending: true, selector: #selector(NSString.localizedCaseInsensitiveCompare))
]
有人知道如何解决这个问题吗?
我还尝试使用sectionNameKeyPath但是
let sectionKeyPath = "(( items.finished == 0).@count > 0 )"
我收到“来自调试器的消息:由于内存问题而终止”
代码:
extension ManagedBox {
@nonobjc open override class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult> {
return NSFetchRequest<ManagedBox>(entityName: "ManagedBox") as! NSFetchRequest<NSFetchRequestResult>;
}
@NSManaged public var paused: Bool
@NSManaged public var title: String?
@NSManaged public var items: NSSet?
}
extension ManagedItem {
@nonobjc open override class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult> {
return NSFetchRequest<ManagedItem>(entityName: "ManagedItem") as! NSFetchRequest<NSFetchRequestResult>;
}
@NSManaged public var finished: Bool
@NSManaged public var title: String?
@NSManaged var box: ManagedBox?
}
答案 0 :(得分:0)
使用CoreData和SQLite后备存储,您只能按持久属性进行排序。因此,一种解决方案是向hasFinishedItems
实体添加新的持久性ManagedBox
属性,并确保在相关ManagedItems
更新时更新此属性。
但我认为更好的解决方案是使用两个获取的结果控制器:一个用{/ 1>}对象处理成品,另一个处理那些而不用成品。两个FRC都将使用ManagedBox
属性进行排序,但其中一个谓词如下:
title
另一个将具有互补谓词:
SUBQUERY(items,$item,$item.finished == 0).@count > 0
您的tableView数据源/委托方法需要有两个部分,第一部分使用第一个FRC填充,第二部分使用第二个FRC填充。类似地,FRC委托方法将需要确保由tableView的第一个FRC更新部分0触发的更改,而第二个FRC更新部分1触发的更改。前提是您要小心将indexPath从FRC重新映射到正确的indexPath对于电视(反之亦然),这应该可行。