ios - guia - qgis manual
¿Cómo puedo acceder a una variable__block después de que el bloque se haya completado? (3)
Esta pregunta ya tiene una respuesta aquí:
Estoy haciendo algunas operaciones en segundo plano con Parse.com, pero esta es una pregunta general sobre las variables __block. Quiero definir una variable, ejecutar una operación de red de fondo con un bloque de finalización, posiblemente modificar esa variable dentro del bloque, y luego acceder a ella fuera del bloque. Pero siempre es nulo.
¿Cómo puedo retener la variable fuera del bloque? Esto está dentro de un método de clase, por lo que usar una variable de instancia no es una opción.
__block PFObject *myObject = nil;
PFQuery *query = [PFQuery queryWithClassName:@"ClassName"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (objects.count)
myObject = [objects lastObject];
}];
NSLog(@"%@",myObject);
El código en el bloque se ejecuta de forma asíncrona. Entonces, el código después del bloque se ejecuta antes de que el código en el bloque haya tenido la oportunidad de ejecutarse (o al menos completarlo).
vea este tutorial en developer.apple.com Trabajando con bloques
Puede usarlos fuera del bloque como cualquier otra variable.
En su código actual, este registro se imprimirá nulo, porque el código dentro del bloque se ejecuta de forma asíncrona, en este caso, cuando los resultados de la búsqueda vuelven.
Si desea un valor significativo de myObject
, realmente debe colocar su registro dentro del bloque, después de la asignación de myObject
.
Ver el orden de ejecución en los comentarios:
__block PFObject *myObject = nil; //1
PFQuery *query = [PFQuery queryWithClassName:@"ClassName"]; //2
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { //3
if (objects.count) //5
myObject = [objects lastObject]; //6
}]; //7
NSLog(@"%@",myObject); //4
Tu no Bueno, puedes acceder como lo haces. Pero el propósito del bloque es que se llamará de manera asíncrona después de un cierto retraso cuando la información esté realmente disponible, por lo que debe hacer su procesamiento en el bloque o llamar a otro método desde el bloque para hacerlo.