46

En Mi código configch_async block No puedo acceder a global variables. Recibo este error Variable is not Assignable (missing _block type specifier).No se ha podido acceder a las variables globales en dispatch_async: "La variable no es asignable (falta el especificador de tipo _block)"

NSString *textString; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
    (unsigned long)NULL), ^(void) { 
     textString = [self getTextString]; 
}); 

Puede alguien ayudarme a averiguar la razón?

+0

Y esto no tiene nada que ver con Xcode. –

Respuesta

135

debe utilizar el especificador __block cuando se modifica una variable dentro de un bloque, por lo que el código que diste debería tener este lugar:

__block NSString *textString; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
               (unsigned long)NULL), ^(void) { 
     textString = [self getTextString]; 
}); 

bloques de capturar el estado de las variables referenciados dentro de sus cuerpos, por lo la variable capturada debe declararse mutable. Y la mutabilidad es exactamente lo que necesitas teniendo en cuenta que básicamente estás configurando esto.

+17

Tenga en cuenta que hay ** dos guiones bajos ** en '__block' –

+0

Pero esta solución sigue siendo inútil: el bloque se ejecuta de forma asincrónica. Entonces, incluso si pudiera asignar la variable local 'testString', ¿quién puede usarla? Lo único que puedo pensar es si hay otro bloque en este ámbito que también use 'textString', que se puede ejecutar más tarde. – newacct

+0

Sin contexto circundante, o código que no es básicamente pseudocódigo, ¿cómo llegaste a esa determinación? Por lo que usted sabe, el OP podría haber omitido la lógica dispatch_group, o quizás algunas llamadas KVO 'will/didChangeValueForKey:' en el bloque. El punto es: te perdiste el sentido de la pregunta. – CodaFi

Cuestiones relacionadas