根据多对多参考对项目进行排序

时间:2017-07-11 16:06:56

标签: swift xcode core-data nssortdescriptor

我希望根据参考项目的属性获取itmes。

就像我有一些盒子,所有盒子里面都有物品,我希望看到按标题(a,b,c,d,e)分类的盒子,但是首先是带有成品的盒子。

  • 方框“a”(5项)
  • 方框“c”(2项)
  • 方框“e”(8项)
  • 框“b”(0项)
  • 方框“d”(0项)

我尝试使用子查询但得不到正确的结果。

我想使用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?
}

1 个答案:

答案 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对于电视(反之亦然),这应该可行。