0
votes

Meilleure façon d'aller chercher des objets enfants et parents avec parser serveur dans iOS

J'essaie de sortir "l'exemple d'application de blog" sur parserser pour iOS et ne peut pas comprendre Quelle est la façon dont Smartes est de chercher tous les objets enfant d'une autre classe (ainsi que les objets parent).

L'exemple "exemple d'application de blog" (qui crée automatiquement lorsque vous créez un nouveau compte) contient les classes commentaire et post . La classe de commentaire contient une relation avec la classe de poste comme indiqué ci-dessous (à partir du tableau de bord), mais il n'y a pas de relation dans la direction opposée.

 Entrez la description de l'image ici

maintenant, je veux chercher tous les messages et tous les commentaires liés à chaque message . Le code ci-dessous fait cela, mais je suppose qu'il doit y avoir une manière plus intelligente ...? Si vous savez comment, s'il vous plaît partager. Merci d'avance! xxx


0 commentaires

3 Réponses :


0
votes

au lieu d'utiliser Inclure sur votre requête, vous devez utiliser sur la suivi: est égal à: et transmettez l'objet post comme deuxième argument. Cela fera filtrer et renvoyer uniquement les objets de commentaire contenant qui contiennent ce post comme valeur pour POST


2 commentaires

Je ne vous suis pas vraiment suivant ... Tout d'abord, je ne veux rien filtrer, comme je l'ai écrit, je veux "tous les postes et tous les commentaires liés à chaque message", et deuxièmement, quel devrait être le premier argument de < Code> OBTENCE: EQUALLE: Voulez-vous dire?


Mon mauvais, j'ai mal interprété votre question et je pensais que vous vouliez avoir les commentaires pour un poste donné (une question commune). Vous pouvez modifier le modèle pour stocker les commentaires dans un tableau dans le poteau, mais je pense que la méthode actuelle est moins sujette aux erreurs, même si elle nécessite un peu plus de logique.



0
votes

Un problème que je vois avec votre requête est qu'il est possible que cela ne récupère pas chaque message dans la base de données. Si un message a 0 commentaires, aucun des objets de commentaire n'en aura une référence et vous ne le recevrez donc pas.

Par conséquent, vous devriez réellement faire une requête sur "Post" et dans son achèvement "Commentaire ". De cette façon, vous ne manquerez aucun message avec 0 commentaires. Lorsque vous faites cela, vous n'aurez pas besoin d'inclure la touche "Post" de la requête de commentaire. Cela a de multiples avantages.

Premièrement, chacun comprend également une autre requête pour cet objet. Donc, chaque nouvel objet de commentaire créera une autre requête dans le backend. Vous allez vous débarrasser de cela automatiquement.

Deuxièmement, pour un "post" avec plusieurs commentaires, vous interrogerez pour le même message à plusieurs reprises et que le même message sera renvoyé plusieurs fois qui consomme une bande passante inutile.

Après avoir obtenu des postes et des commentaires séparément, il suffit de les combiner séparément.

En dehors de cela, je ferais la combinaison comme ce que je trouve plus lisible mais qui n'est que des préférences personnelles. xxx


0 commentaires

0
votes

Voici comment je l'ai fait, en utilisant FindObjectsInbackground code> avec ContinuWithSucCessBlock: Code> Méthodes (pour une meilleure manipulation des erreurs, on peut choisir ContinuWithblock: CODE> :

- (void)fetchPosts {
    /**
     create "post" and "comment" queries and use a BFTask-method from 
     Bolts.framework to chain downloading tasks together (bundled with Parse SDK)
     */
    NSMutableArray *posts = [NSMutableArray new];
    PFQuery *postQuery = [PFQuery queryWithClassName:@"Post"];
    [[[postQuery findObjectsInBackground] continueWithSuccessBlock:^id(BFTask * task) {

        [posts addObjectsFromArray:task.result];
        PFQuery *commentsQuery = [PFQuery queryWithClassName:@"Comment"];
        return [commentsQuery findObjectsInBackground];
    }] continueWithSuccessBlock:^id(BFTask * task) {
        /**
         loop through posts and filter out comments with the same objectId in post,
         then create a dictionary with post and related comments. done! :)
         */
        NSMutableArray *postsAndComments = [NSMutableArray new];
        for (PFObject *post in posts) {
            NSArray *comments = [task.result filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%K == %@", @"post.objectId", post.objectId]];
            [postsAndComments addObject:@{@"post":post, @"comments":comments}];
        }
        /**
         note: BFTask-blocks not running in main thread!
        */
        dispatch_async(dispatch_get_main_queue(), ^{
            self.posts = postsAndComments;  // assuming: @property (nonatomic, strong) NSArray *posts;
        });
        return nil;
    }];
}


0 commentaires