Verifier la valeur d'une variable

Bonjour a tous,

 

J'ai une petite question, dont la réponse est surement très simple, mais je ne la trouve pas.

J'utilise Parse.com pour le backend de mon application.

J'ai une classe AllBikes qui contient une colonne appelée bikeId. Je souhaite verifier que la valeur de ma variable bikeName existe dans cette colonne. Pour cela, je fais une requête query ou je vérifie son existence.

Si elle est existe, ma fonction checkIfExist renvoie YES, sinon elle renvoie NO.

 

Le problème, c'est que je bloque ici : 



if([bikeName isEqualToString:myBike])

J'ai une erreur me disant que la variable myBike n'est pas déclarée alors que je la déclare au dessus...

 

Si vous avez une idee, ca serait sympa, j'ai essaye un paquet de trucs, j'arrive pas... 

 

Merci



- (BOOL)checkIfExist {
 
    BOOL check = NO;
    NSString *bikeName = bikeNameField.text;
    PFQuery *query = [PFQuery queryWithClassName:@AllBikes];
    [query whereKey:@bikeId equalTo:@bikeName];
    [query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
        if (!object) {
            NSLog(@The getFirstObject request failed.);
        } else {
           NSString *myBike = object[@bikeId];
        }
    }];
 
    if([bikeName isEqualToString:myBike])
    {
        check = YES;
    }
    return check;
}

Réponses

  • AliGatorAliGator Membre, Modérateur
    Tu déclares ta variable dans un sous bloc à  l'intérieur d'accolades (dans le bloc de ton "else").


    Quand on déclare une variable elle n'existe que dans la portée de son bloc "{ ... }" englobant. Du coup ta variable n'existe plus une fois que tu sors de ce bloc et que tu passes l'accolade fermante.


    La solution est de déclarer ta variable hors du bloc (à  côté de ton BOOL check = NO) et lui donner une valeur de nil, puis juste l'affecter dans le else.


    Car là  si tu passes pas dans le else... bah tu t'attends à  quoi ?
  • MichelMichel Membre
    juin 2014 modifié #3

    Ok merci AliGator !


    Bon, j'ai expérimenté quelques trucs, et je suis encore un peu bloqué.


     


    J'ai déclaré la variable juste après la déclaration de BOOL, et je l'ai affecté dans le else, mais j'ai une erreur "Variable is not assignable (missing block type specifier)".


    Du coup pour tester, j'ai assigné un type a myBike dans le else : NSString*myBike = object[@bikeId]. Bon évidemment, du coup plus d'erreur, mais la valeur de myBike est tout le temps nulle puisque déclarée en haut comme étant égale a nil.


     


    Bref, je continue mes recherches...


     




    - (BOOL)checkIfExist {


        BOOL check = NO;
        NSString *myBike = nil;
        NSString *bikeName = bikeNameField.text;
        PFQuery *query = [PFQuery queryWithClassName:@AllBikes];
        [query whereKey:@bikeId equalTo:@bikeName];
        [query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
            if (!object) {
                NSLog(@The getFirstObject request failed.);
            } else {
               myBike = object[@bikeId];
            }
        }];


        if([bikeName isEqualToString:myBike])
        {
            check = YES;
        }
        NSLog(@Name = %@", myBike);
        NSLog(@BOOL = %d, (int)check);
        return check;
    }

  • AliGatorAliGator Membre, Modérateur
    Alors j'avais pas tout examiné de ton code, mais il y a un problème de principe en fait.

    Tu fais des opérations asynchrones, via "getFirstObjectInBackgroundWithBlock:" qui comme son nom l'indique effectue des choses en tâche de fond, puis exécute le code dans le block seulement une fois que l'opération en tâche de fond est finie.

    Du coup ça n'a pas de sens de tester ton isEqualToString là  où tu le mets, car tu fais ton test à  l'extérieur du block donc l'opération asynchrone vient d'être lancée... mais n'est pas encore finie !

    Il faut faire ton test dans le block sinon ça n'a pas de sens. Une petite révision / lecture sur les blocks et les opérations asynchrones pourrait faire du bien ;)
  • MichelMichel Membre
    juin 2014 modifié #6

    Merci pour vos réponses.


    Je me doutais que c'était lie aux operations asynchrones, je ne suis pas a l'aise avec cette notion... Je vais regarder en details, tes explications m'aident beaucoup !

  • C'est bon, j'ai réussi a m'en sortir !


    J'ai du modifier une bonne partie de mon code pour intégrer les instructions dans le "else" etc... Ouf !


    Au final, j'ai remarque que je bloquais toujours avec les requêtes avec Parse.com. Et si c'était a refaire, je pense que je n'utiliserai pas Parse, j'ai peut être trop l'habitude du SQL, mais ca coince souvent pour des trucs simples. Sur leurs exemples, ca semble hyper facile mais lorsqu'il faut faire des requêtes sur plusieurs classes, quelle galère  :*


    Merci pour vos explications !


Connectez-vous ou Inscrivez-vous pour répondre.