49 votes

Impossible d'accéder aux variables globales dans dispatch_async : "La variable n'est pas assignable (spécificateur de type _block manquant)"

Dans mon code dispach_async block Je ne peux pas accéder global variables . J'obtiens cette erreur Variable is not Assignable (missing _block type specifier) .

NSString *textString;

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

Quelqu'un peut-il m'aider à en trouver la raison ?

0 votes

Et cela n'a rien à voir avec Xcode.

139voto

CodaFi Points 29073

Vous devez utiliser le spécificateur __block lorsque vous modifiez une variable à l'intérieur d'un bloc. Le code que vous avez donné devrait donc ressembler à ceci :

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

Les blocs capturent l'état des variables référencées à l'intérieur de leur corps, la variable capturée doit donc être déclarée mutable. Et la mutabilité est exactement ce dont vous avez besoin étant donné que vous êtes essentiellement en train de paramétrer cette chose.

17 votes

Veuillez noter qu'il existe deux tirets bas en __block

0 votes

Mais cette solution reste inutile : le bloc est exécuté une fois de manière asynchrone. Donc, même s'il pouvait assigner à la variable locale testString qui peut l'utiliser ? La seule chose à laquelle je peux penser, c'est qu'il y a un autre bloc dans ce champ d'application qui utilise également la fonction textString qui peut être exécuté ultérieurement.

0 votes

Sans contexte environnant, ou sans code qui ne soit pas essentiellement un pseudo-code, comment êtes-vous parvenu à cette conclusion ? Pour autant que vous le sachiez, le PO pourrait avoir omis la logique de dispatch_group, ou peut-être une partie de la KVO. will/didChangeValueForKey: appels dans le bloc. Le fait est que vous n'avez pas compris le sens de la question.

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