Приказ в реальном времени по возрастанию по дате всегда терпит неудачу

Я новичок в Realm и я нахожу это очень интересным и уже удалось сохранить и извлечь данные. Среди моих данных, которые я сохраняю, я также сохраняю NSDate() поэтому я могу сортировать свои результаты с помощью логического LIFO, это означает, что последнее, которое сохраняется, должно быть первым в представлении таблицы. Это мой код!

 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 - это объект Date Time, который я сохраняю, пока пользователь нажимает кнопку сохранения в другом представлении. Вид таблицы остается тем же, даже если я устанавливаю восходящее значение true или false. Любая идея, почему бы и нет???

+2
источник поделиться
1 ответ

sorted(_:, ascending:) не изменяет Results<T>. Вы tableView(tableView:, cellForRowAtIndexPath:) отсортировать результаты в 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 являются живыми, автоматически обновляя представления в базовые данные, что означает, что результаты никогда не должны повторно учитываться.

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
}
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос