11 votes

Essayer de comprendre les blocs sur iOS

J'essaie de comprendre comment utiliser les blocs sur iOS. J'ai lu la documentation d'Apple mais, comme d'habitude, elle est vague et incomplète et plusieurs éléments d'information essentiels ne sont pas mentionnés. J'ai également cherché sur Google, sans succès. Voici ce que j'essaie de faire comme exercice pour comprendre cela.

J'ai créé un bloc pour lire une chaîne de caractères et comparer cette chaîne à la lecture précédente. Si les chaînes ne sont pas les mêmes, il renvoie YES, si elles sont les mêmes, il renvoie NO.

C'est comme ça que j'ai fait :

J'ai déclaré ceci sur .h

BOOL (^differentStrings)(void);

J'ai déclaré ceci dans le fichier .m, à l'intérieur de viewDidLoad dans un viewController.

__block NSString * previousString;
__block NSString * currentString;
differentStrings = ^(void){

    currentString = [self getString];
    NSLog(@"%@", currentString); // not printing anything on console

    if (![currentString isEqualToString:previousString]) {
        previousString = currentString;
        return YES;
    } else {
        return NO;
    }
};

Voici comment je l'utilise : J'ai un fil qui fait ça :

if (differentStrings)
  NSLog (@"strings are different);

Ce sont les problèmes que j'ai :

  1. le bloc retourne toujours OUI (les chaînes sont différentes)
  2. Je ne suis pas à l'aise pour déclarer ceci dans videDidLoad. Comment dois-je le déclarer pour pouvoir l'utiliser globalement comme une méthode ? Dois-je le placer comme je le ferais avec une méthode ?
  3. J'appelle une méthode "getString" à l'intérieur du bloc. Est-ce que c'est correct ?
  4. Je trouve étrange de déclarer les variables de bloc dans .m. D'après ce que je vois, je devrais déclarer les variables de bloc dans .h et ensuite les utiliser dans .m. J'ai essayé de le faire, mais j'ai reçu une erreur.
  5. J'ai configuré un point de débogage sur la première ligne du bloc mais il ne s'arrête pas là ;
  6. La ligne NSlog à l'intérieur du bloc n'imprime rien. Le bloc n'est-il pas appelé ?

Pouvez-vous m'aider ?

4voto

Brad Larson Points 122629

Je ne crois pas que tu sois en train d'exécuter le bloc. Je pense que votre code devrait être

if (differentStrings())
{
    NSLog (@"strings are different);
}

Traitez un bloc comme une fonction. Je pense que vous vérifiez simplement si le bloc a été défini, sans l'exécuter.

De même, si vous n'avez pas besoin d'accéder à une NSString en dehors du bloc, vous pouvez vous débarrasser de l'élément __block et déplacer le currentString à l'intérieur du bloc.

Si vous avez besoin d'une autre ressource sur les blocs, je les couvre dans la session d'automne de mon cours de développement iOS avancé sur iTunes U . Je décris la syntaxe des blocs dans la session Comprendre Cocoa, et leur utilisation dans Grand Central Dispatch dans la session Multithreading. Les notes de cours contiennent également des liens vers des exemples d'applications qui utilisent les blocs de différentes manières.

Je ne peux pas non plus vous recommander assez de regarder les WWDC 2010 les sessions vidéo 206 - Introducing Blocks and Grand Central Dispatch on iPhone et 211 - Simplifying iPhone App Development with Grand Central Dispatch.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X