使用 List 属性 的计数对 Realm 对象进行排序

Sort Realm objects with the count of List property

我有两个 Realm 数据模型 类 像这样:

class TaskList: Object {

   dynamic var name = ""
   dynamic var createdAt = NSDate()
   let tasks = List<Task>()
}

并且:

class Task: Object {

   dynamic var name = ""
   dynamic var createdAt = NSDate()
   dynamic var notes = ""
   dynamic var isCompleted = false
}

现在我需要查询 TaskList 并根据每个任务中的任务数对它们进行排序。我尝试使用类似这样的东西,但它使应用程序崩溃,因为它不受支持:

realm.objects(TaskList).sorted("tasks.count")

像这样:

realm.objects(TaskList).sort { [=10=].tasks.count < .tasks.count }

编辑:不知道 Realm,这仅在 objects returns 一个 CollectionTypeList 有一个 count 属性.

另一种解决方法是:

TaskList中引入taskCount属性,并使taskCounttasks.count始终同步。

class TaskList: Object {
    dynamic var name = ""
    dynamic var createdAt = NSDate()
    let tasks = List<Task>()
    dynamic var taskCount = 0
}

然后,您可以使用

realm.objects(TaskList).sorted("taskCount")

由于 Realm 目前不支持对关键路径进行排序。

如果您想自动同步 taskCounttasks.count,您可以按照以下步骤操作:

(不要直接使用tasks.append(),而是使用addTask()方法。)

class TaskList: Object {
    dynamic var name = ""
    dynamic var createdAt = NSDate()
    private let tasks = List<Task>()
    dynamic var taskCount = 0

    func addTask(task: Task) {
        func add() {
            tasks.append(task)
            taskCount = tasks.count
        }
        if let realm = realm where !realm.inWriteTransaction {
            try! realm.write{
                add()
            }
        } else {
            add()
        }
    }
}