我正在使用
Swift和Core Data构建一个应用程序.在我的应用程序的某一点上,我想让UITableView显示当前在持久存储中的所有类型的对象.目前,我正在检索它们并使用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 } } }
在我的表视图控制器中,我正在设置我的NSFetchedResultsController的fetchRequest,如下所示:
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子类的计算属性对表视图进行排序?
解决方法
正如Martin所指出的那样,你不能对计算属性进行排序.只需在每次拍摄时更新俱乐部的新存储属性.