4
votes

Comment trier les résultats dans le royaume

J'utilise Realm avec Swift. Je souhaite trier les "images" enregistrées dans Realm par PhotoCollectionViewController dans l'ordre inverse des dates. Je ne sais pas quoi faire. Je serais heureux si vous pouviez me prêter votre sagesse.

Models.swift

import UIKit
import RealmSwift

class PhotoCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    var pictures : Results<Picture>?

    override func viewWillAppear(_ animated: Bool) {
        getPictures()
    }

    func getPictures() {
        if let realm = try? Realm() {
            pictures = realm.objects(Picture.self)
            //I want to sort pictures in the reverse order of date
            collectionView?.reloadData()
        }
    }
…
}

PhotoCollectionViewController.swift

import RealmSwift

class Entry: Object {
    @objc dynamic var text = ""
    @objc dynamic var date = Date()
    let pictures = List<Picture>()
    }
class Picture: Object {
    @objc dynamic var fullImageName = ""
    @objc dynamic var thumbnailName = ""
    @objc dynamic var entry : Entry?
    }

p>


9 commentaires

realm.objects (Picture.self) .sorted (byKeyPath: "date", croissant: false) ?


J'ai essayé, mais les images deviennent nulles et le projet s'arrêtera à cause de l'erreur "Thread 1: signal SIGABRT".


"Thread 1: signal SIGABRT" ne me dit pas grand-chose. Qu'est-ce qui est imprimé dans les journaux?


Le journal des erreurs est le suivant. *** Arrêt de l'application en raison d'une exception non interceptée 'RLMException', raison: 'Impossible de trier sur le chemin de clé' date ': la propriété' Picture.date 'n'existe pas.'


Je viens de réaliser que Picture n'a pas de date . Entry le fait. Vouliez-vous plutôt récupérer et trier les objets Entry ?


Maintenant, j'ai plusieurs objets Picture dans l'entrée. Et, dans PhotoCollectionViewController, je souhaite obtenir uniquement des objets Picture. Comment obtenir toutes les photos triées si j'obtiens un objet Entry trié?


Essayez .flatMap {$ 0.pictures}


La raison pour laquelle ces réponses qui sont partout est que la question n'est pas claire. La question porte sur le tri d'une liste dans le royaume. Cependant, les objets image en cours de chargement ne figurent pas dans une liste et n'ont pas non plus de propriété de date. Donc, demander Je veux trier les images dans l'ordre inverse des dates ne fonctionnera pas. Cela étant dit, votre objet d'entrée a une date et il a une liste des objets image . Ainsi, les objets d'entrée peuvent être triés par date, ce qui signifie que la liste d'images associée serait associée à la date de cet objet. Mais encore une fois, les photos n'ont pas de propriété de date, elles n'ont donc pas de commande.


Je suis désolé que ma question ne soit pas claire. Je pourrais comprendre comment obtenir List grâce à la réponse de Sweeper, mais je ne sais pas comment gérer cette liste ... Je pense que c'est la solution simple pour créer une propriété de date dans Picture? Bref, je vais essayer moi-même, merci.


3 Réponses :


2
votes

Vous devriez pouvoir le trier avec le code suivant

realm.objects(Picture.self).sorted(byKeyPath: "date", ascending: false)


2 commentaires

J'ai essayé, mais les images deviennent nulles et le projet s'arrêtera. Le journal des erreurs est le suivant. *** Arrêt de l'application en raison d'une exception non interceptée 'RLMException', raison: 'Impossible de trier sur le chemin de clé' date ': la propriété' Picture.date 'n'existe pas.' Maintenant, j'ai plusieurs objets Picture dans l'entrée. Et, dans PhotoCollectionViewController, je souhaite obtenir uniquement des objets Picture.


Il semble que vous n'ayez aucun champ dans la base de données Realm pour Picture qui est nommé "date". Vous devez mettre à jour byKeyPath avec le nom de ligne qui contient votre date



1
votes

Si j'ai bien compris, vous voulez trier les objets Entry puis flatMap en un groupe de Picture s:

var pictures = realm.objects(Entry.self)
                   .sorted(byKeyPath: "date", ascending: false)
                   .flatMap { $0.pictures }


0 commentaires

1
votes

Désolé, je l'ai résolu moi-même. J'ai changé les "images" comme suit, J'ai pu faire ce que j'attendais.

pictures = realm.objects(Picture.self).sorted(byKeyPath: "entry.date", ascending: false)

Merci pour les réponses et les conseils.


0 commentaires