J'essaie de comprendre comment utiliser les blocs sur iOS. J'ai lu les documents d'Apple mais, comme d'habitude, ils sont vagues et incomplets et plusieurs informations essentielles ne sont pas mentionnées. J'ai aussi googlé sans succès. C'est ce que j'essaie de faire pour comprendre cela.Essayer de comprendre les blocs sur iOS
J'ai créé un bloc pour lire une chaîne et comparer la chaîne à la lecture précédente. Si les chaînes ne sont pas identiques, renvoyez YES, si elles sont identiques, renvoyez NO.
Voilà comment je l'ai fait:
Je déclare ceci sur .h
BOOL (^differentStrings)(void);
Je déclarais cela sur .m, à l'intérieur 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;
}
};
Voilà comment je utiliser: J'ai un fil qui fait ceci:
if (differentStrings)
NSLog (@"strings are different);
Ce sont les problèmes que j'ai:
- le bloc reviennent toujours OUI (chaînes sont différentes)
- Je ne suis pas à l'aise de déclarer ceci à l'intérieur videDidLoad. Comment dois-je déclarer ceci, afin que je puisse l'utiliser globalement comme une méthode? Dois-je mettre cela comme je le ferais avec une méthode?
- J'appelle une méthode "getString" à l'intérieur du bloc. Est-ce que c'est bon?
- Je trouve étrange de déclarer les variables de bloc sur .m. Comme je le vois, je devrais déclarer les variables de bloc sur .h et ensuite les utiliser sur .m. J'ai essayé de le faire, mais j'ai reçu une erreur.
- J'ai mis en place un point de débogage sur la première ligne du bloc mais il ne s'arrête pas là;
- La ligne NSlog à l'intérieur du bloc n'imprime rien. Le bloc n'est-il pas appelé?
Pouvez-vous m'aider avec ça?
Je pense que vous auriez aussi besoin de "copier" le bloc lors de l'attribution à l'ivar. Sinon, le bloc sort de la portée en quittant 'viewDidLoad'. De même, alors que 'previousString' doit être une variable' __block', 'currentString' peut être une variable locale. –
Tout à fait raison. J'ai mis à jour ma réponse. –
merci pour la réponse. J'ai ajouté la parenthèse quand j'ai appelé le bloc et ai également fait un Block_copy (differentStrings) après l'avoir créé sur viewDidLoad mais il se bloque quand j'appelle le bloc using differentStrings() ...J'ai essayé d'appeler le bloc de la même portée et cela fonctionne mais quand je l'appelle d'une portée différente, il se bloque, même avec le Block_copy. – SpaceDog