何时/如何在Swift中为UITableView排序Realm子<list>属性

时间:2019-03-10 20:08:05

标签: swift uitableview realm

我在UITableView中使用2个Realm对象作为数据源:

class SectionDate: Object {

   @objc dynamic var date = Date()
   let rowDates = List<RowDate>() 
}
class RowDate: Object {

   @objc dynamic var dateAndTime = Date()
}
tableViewData = realm.objects(SectionDate.self).sorted(byKeyPath: "date", ascending: isAscending)

func numberOfSections(in tableView: UITableView) -> Int {
    return tableViewData.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return tableViewData[section].rowDates.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    ...
    cell.rowDate = tableViewData[indexPath.section].rowDates[indexPath.row]
    ...
}

我将如何订购section.rowDate,何时订购?

我似乎不能将它作为section.sorted(byKeyPath)查询的一部分...在对SectionDate对象进行初始化时可以做到吗?

1 个答案:

答案 0 :(得分:1)

否,您无法在创建rowDates对象时对SectionDate成员进行排序。 List是一种Realm类型,它不会(有必要)以排序方式存储列表。

您将需要在对象的每次查询中对rowDates对象进行排序。一种建议是将计算属性添加到SectionDate类中(计算的-未存储),该类返回按要求排序的查询。然后在cellForRowAt函数中访问该属性。例如:

extension SectionDates
{
  var sortedRowDates
  {
    return rowDates.sorted(byKeyPath: "date", ascending: isAscending)
  }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  ...
  cell.rowDate = tableViewData[indexPath.section].sortedRowDates[indexPath.row]
  ...
}

这当然意味着正在为每个单元格运行查询,但是可以。还有其他解决方案,例如在viewDidLoad中创建数据的静态副本,但是除非您遇到任何特殊问题,否则我认为不需要这样做。