Estoy tratando de entender cómo usar bloques en iOS. He leído los documentos de Apple pero, como de costumbre, son vagos e incompletos y no se mencionan varios datos esenciales. También he buscado en Google sin éxito. Esto es lo que trato de hacer como ejercicio para comprender eso.Intentando comprender bloques en iOS
He creado un bloque para leer una cadena y comparar la cadena con la lectura anterior. Si las cadenas no son iguales, devuelva SÍ, si son iguales, devuelva NO.
Esta es la forma en que lo hice:
I declaró esto en .h
BOOL (^differentStrings)(void);
declaré esto en .m, dentro viewDidLoad en 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;
}
};
Éste es cómo uso: Tengo un hilo que hace esto:
if (differentStrings)
NSLog (@"strings are different);
Estos son los problemas que tengo:
- el bloque siempre vuelven Sí (cadenas son diferentes)
- No me siento cómodo declarar esta videDidLoad interior. ¿Cómo debo declarar esto, para poder usarlo globalmente como método? ¿Debería poner esto como lo haría con un método?
- Estoy llamando a un método "getString" dentro del bloque. ¿Está bien?
- Me resulta extraño declarar las variables de bloque en .m. Como veo, debo declarar las variables de bloque en .h y luego simplemente usarlas en .m. Intenté hacer eso, pero recibí un error.
- He configurado un punto de depuración en la primera línea del bloque, pero no se detiene allí;
- NSlog línea dentro del bloque no imprime nada. ¿No se llama al bloque?
¿Pueden ayudarme con esto?
Creo que también necesitarás 'copiar' el bloque cuando lo asignes al ivar. De lo contrario, el bloque sale del alcance al salir de 'viewDidLoad'. Además, si 'previousString' necesita ser una variable' __block', 'currentString' puede ser una variable local de bloque. –
Absolutamente correcto. He actualizado mi respuesta. –
gracias por la respuesta. He agregado el paréntesis cuando llamé al bloque y también hice un Block_copy (differentStrings) después de crearlo en viewDidLoad pero se cuelga cuando llamo al bloque usando differentStrings() ...Intenté llamar al bloque desde el mismo ámbito y funciona, pero cuando lo llamo desde un ámbito diferente, se bloquea, incluso con Block_copy. – SpaceDog