2015-10-05 1 views
0

J'ai besoin d'effectuer certaines opérations de manière séquentielle. De nombreux objets sont conformes à un protocole (avec une méthode, c'est-à-dire execute()) insérée dans un tableau dans l'ordre d'exécution.Effectuer un lot d'opérations avec une interaction de l'utilisateur au milieu de chaque

Tout semble simple à l'aide GCD avec quelque chose comme:

dispatch_queue_t serialQuele = dispatch_queue_create("myQueue", NULL); 

for (id <ExecutableProtocol> exec in executables) 
{ 
    dispatch_async(serialQuele, ^{ 
     [exec executeWithCompletionBlock:^(NSString *name, Status *state) { 
      [self.executeResults setObject:state forKey:name]; 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       if (self.delegate) 
        [self.delegate didExecuted: exec withResult:state userInfo:userInfo]; 
      }); 
     }]; 
    }); 
} 

L'idée semble bonne, mais si un exécuteur demande à l'utilisateur une question avec un UIAlertController ... l'exécuteur testamentaire suivant ne peut pas montrer sa boîte de dialogue aussi avec UIAlertController parce que l'utilisateur n'a pas encore répondu à la question et la boîte de dialogue précédente est toujours affichée.

Comment puis-je réaliser ce à quoi je m'attendrais?

Merci.

Répondre

0

Je pense que le changement de l'ordre entre le premier dispatch_async et la boucle et en changeant le dispatch_async à dispatch_sync réalise ce que vous voulez. Je ne suis pas certain d'avoir compris ce que vous voulez que votre code fasse, donc je peux me tromper.

dispatch_async(serialQuele, ^{ 
    for (id <ExecutableProtocol> exec in executables) 
    { 
     [exec executeWithCompletionBlock:^(NSString *name, Status *state) { 
      [self.executeResults setObject:state forKey:name]; 

      if (self.delegate) { 
      dispatch_sync(dispatch_get_main_queue(), ^{ 

       [self.delegate didExecuted: exec withResult:state userInfo:userInfo]; 
      )}; 
     }]; 
    } 
}); 
+0

Merci Lev mais comme vous l'avez suggéré l'interface utilisateur est le gel ... sur le journal que j'ai vu tous les éléments sont exécutés, mais l'interface est arrêté sur le premier élément et l'utilisateur ne peut pas répondre parce que tout est bloque. – jerrygdm

+0

C'est étrange. J'ai du mal à voir pourquoi. Il bloquerait les appels 'dispatch_sync (dispatch_get_main_queue(),^{...})' dans la méthode 'didExecuted: withResult: userInfo', mais je suppose que vous l'avez vérifié. –

+0

à l'intérieur de la méthode didExecuted, il n'y a qu'un seul reloadData d'une collection ... – jerrygdm