2016-07-23 8 views
2

Ich bin neu in Realm und ich finde es sehr interessant und bereits haben es geschafft, Daten zu speichern und abzurufen. Unter meinen Daten, die ich speichere, speichere ich auch eine NSDate(), so dass ich meine Ergebnisse mit der Logik LIFO sortieren kann, das bedeutet, dass die letzte, die gespeichert wird, zuerst in der Tabellenansicht sein sollte. Das ist mein Code!Realm Auftrag aufsteigend nach Datum immer scheitert

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 
    } 

Die Variable realmgettime ist das Datum Zeit Objekt, das i zu speichern, während der Benutzer-Taste in einer anderen Ansicht speichern drückt. Die Tabellenansicht bleibt gleich, auch wenn ich aufsteigend auf wahr oder falsch setze. Irgendeine Idee warum nicht ??

Antwort

1

sorted(_:, ascending:) ändert keine Results<T>. Sie versuchen, die Ergebnisse in tableView(tableView:, cellForRowAtIndexPath:) zu sortieren, aber das hat keinen Sinn. Weil Sie den Rückgabewert ignoriert haben.

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

Above Code sollte wie folgt sein:

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

Mehr besseren Weg, Methode verketten.

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

Außerdem Results Instanzen sind Live, Auto-Aktualisierung Ansichten in die zugrundeliegenden Daten, was bedeutet, Ergebnisse nie wieder geholt werden müssen.

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

So brauchen Sie nicht jedes Mal für dieselbe Abfrage erneut zu holen. Behalte die Ergebnisse einmal, verwende sie einfach überall im selben Thread. Die empfohlene Methode ist wie folgt:

... 
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 
} 
+0

Ihr Code funktioniert perfekt, obwohl für die LIFO-Sortierung i 'true' zu' false' geändert und es funktionierte. Verstehe aber nicht warum –