ios - 按日期升序的 Realm 顺序总是失败

标签 ios swift swift2 realm

我是 Realm 的新手,我发现它非常有趣并且已经设法保存和检索数据。在我保存的数据中,我还保存了一个 NSDate(),这样我就可以使用逻辑 LIFO 对结果进行排序,这意味着最后保存的应该最先到 TableView 。这是我的代码!

 override func viewDidLoad() {
     super.viewDidLoad()

     let realmaki = try! Realm()

     var eventodos = realmaki.objects(eventsNewSaved2)
 }

 func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
     return 288.0
 }

 func numberOfSectionsInTableView(tableView: UITableView) -> Int {
     return 1
 }

 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     let realm = try! Realm()
     let eventodoscount = realm.objects(eventsNewSaved2).sorted("realmgettime", ascending: true).count
        return eventodoscount
 }

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier("savedCell", forIndexPath: indexPath) as! locationEventsTableViewCell
        let realm = try! Realm()
        let eventakiaSaved = realm.objects(eventsNewSaved2)
        eventakiaSaved.sorted("realmgettime", ascending: true)
        let task = eventakiaSaved[indexPath.row] as eventsNewSaved2

        cell.eventTitle?.text = "\(task.realmtitle)"
        cell.eventDate.text = "\(task.realmdate)"
        cell.eventAttends.text = "\(task.realmattends)"

        let imageDef : UIImage = UIImage(named: "noimage")!

        if task.realmeventCover == "No Image Available" {

            cell.eventImage.image = imageDef
        } else {
            let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
            dispatch_async(dispatch_get_global_queue(priority, 0)) {

                let realm = try! Realm()
                let eventakiaSaved = realm.objects(eventsNewSaved2)
                eventakiaSaved.sorted("realmgettime", ascending: true)
                let task = eventakiaSaved[indexPath.row] as eventsNewSaved2
                    let url = NSURL(string: task.realmeventCover)

                    if url != nil {
                        let data = NSData(contentsOfURL: url!)
                        dispatch_async(dispatch_get_main_queue()) {
                            cell.eventImage.image = UIImage(data: data!)
                        }

                    } else {
                        cell.eventImage.image = imageDef
                    }
            }
        }

        return cell
    }

变量 realmgettime 是当用户在另一个 View 中按下保存按钮时我保存的日期时间对象。 即使我将升序设置为 true 或 false, TableView 也保持不变。 知道为什么不吗??

最佳答案

sorted(_:, ascending:)不修改 Results<T> .您尝试对 tableView(tableView:, cellForRowAtIndexPath:) 中的结果进行排序,但这样做没有意义。因为你忽略了返回值。

let eventakiaSaved = realm.objects(eventsNewSaved2)
eventakiaSaved.sorted("realmgettime", ascending: true)

上面的代码应该是这样的:

var eventakiaSaved = realm.objects(eventsNewSaved2)
var eventakiaSaved = eventakiaSaved.sorted("realmgettime", ascending: true)

更好的方法是链接方法。

let eventakiaSaved = realm.objects(eventsNewSaved2)
                          .sorted("realmgettime", ascending: true)

此外,Results实例是实时的、自动更新底层数据的 View ,这意味着永远不必重新获取结果。

https://realm.io/docs/swift/latest/#auto-updating-results

所以你不需要每次都为同一个查询重新获取。保留一次结果,只要在同一个线程中,就可以在任何地方使用它。 推荐的方式如下:

...
var eventodos: Results<eventsNewSaved2>? // Keep results as a model
...

override func viewDidLoad() {
    super.viewDidLoad()

    let realm = try! Realm()
    eventodos = realm
        .objects(eventsNewSaved2)
        .sorted("realmgettime", ascending: true) // Query only once
}

...

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return eventodoscount?.count ?? 0
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("savedCell", forIndexPath: indexPath) as! locationEventsTableViewCell

    let task = eventodos[indexPath.row]

    cell.eventTitle?.text = "\(task.realmtitle)"
    cell.eventDate.text = "\(task.realmdate)"
    cell.eventAttends.text = "\(task.realmattends)"

    let imageDef : UIImage = UIImage(named: "noimage")!

    if task.realmeventCover == "No Image Available" {
        cell.eventImage.image = imageDef
    } else {
        let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
        dispatch_async(dispatch_get_global_queue(priority, 0)) {
            let realm = try! Realm()
            // Need re-fetch because this within sub-thread
            let eventakiaSaved = realm
                .objects(eventsNewSaved2)
                .eventakiaSaved.sorted("realmgettime", ascending: true)

            let task = eventakiaSaved[indexPath.row]
            let url = NSURL(string: task.realmeventCover)

            if url != nil {
                let data = NSData(contentsOfURL: url!)
                dispatch_async(dispatch_get_main_queue()) {
                    cell.eventImage.image = UIImage(data: data!)
                }
            } else {
                cell.eventImage.image = imageDef
            }
        }
    }

    return cell
}

关于ios - 按日期升序的 Realm 顺序总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38546783/

相关文章:

ios - 非常慢的软件矢量,尤其是 CoreGraphics 与 OpenGL

ios - 弹出式导航的导航在SwiftUI中不起作用?

ios - Swift 编程约束不起作用

ios - 如何使用枚举简化并使其更好,快速学习,枚举

ios - 基于 customObject 属性订购 Collection View 单元格 - Swift 4 -Xcode 9

ios - 如何在tableview中实现tableview?

ios - 根据位置列表将 MKMapView 缩放到最适合距离的缩放级别

swift - RealityKit – 为什么 AnchorEntity 位置始终为 (x : 0, y : 0, z: 0)

ios - 如何在 ios swift 中使用 nsurlconnection 从 FTP 服务器下载包含多个文件的完整目录?

swift - 为什么在这种情况下非可选函数可以返回 nil?