通过Swift计算属性对NSManagedObject子类的NSFetchedResultsController进行排序

13

我正在使用Swift和Core Data构建一个应用程序。在我的应用程序中的某个时刻,我想让UITableView显示当前在Persistent Store中的某种类型的所有对象。目前,我正在使用NSFetchedResultsController检索它们并在表视图中显示它们。我希望该表视图按照我NSManagedObject子类的计算属性进行排序,其代码如下:

class MHClub: NSManagedObject{
@NSManaged var name: String
@NSManaged var shots: NSSet
var averageDistance: Int{
    get{
        if shots.count > 0{
            var total = 0
            for shot in shots{
                total += (shot as! MHShot).distance.integerValue
            }
            return total / shots.count
        }
        else{
            return 0
        }
    }
}

在我的表视图控制器中,我正在按以下方式设置NSFetchedResultsControllerfetchRequest

let request = NSFetchRequest(entityName: "MHClub")
request.sortDescriptors = [NSSortDescriptor(key: "averageDistance", ascending: true), NSSortDescriptor(key: "name", ascending: true)]

按照这种设置方式,我的应用程序会崩溃,并在日志中显示以下消息:

'NSInvalidArgumentException', reason: 'keypath averageDistance not found in entity <NSSQLEntity MHClub id=1>'

如果我删除第一个排序描述符,我的应用程序就可以正常运行,但是我的表视图并没有按照我想要的方式进行排序。如何根据Swift中NSManagedObject子类的计算属性对我的表视图进行排序?


5
一个 Core Data 的 fetch 请求不能基于计算属性进行排序,只能基于持久化存储的属性进行排序。可以参考(例如)https://dev59.com/YGrXa4cB1Zd3GeqPB7NG。 - Martin R
此外,您的total被推断为整数,因此平均值将是错误的。例如,射击1,1,3 = 5/3 = 1。 - Mundi
1个回答

8
正如Martin所指出的那样,您无法根据计算属性进行排序。只需每次拍摄时更新俱乐部的新存储属性即可。

2
非常难过...找到一个解决方案会很好。 - Magoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接