2017-05-03 3 views
-1

par exemple: i ont une fonctionСall un corps de bloc de la méthode dataTaskWithRequest toujours

-(void) someFunc:(NSString *) searchRequest { 
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 
[[session dataTaskWithRequest:request 
       completionHandler:^(NSData *data,NSURLResponse *response, NSError *error) 
            { 
        // body block 
           } 
] 
    resume]; 
} 

et je l'appelle someFunc dans:

- (IBAction)searchButtonPressed:(id)sender { 
NSString * searchRequest = @"blablabla"; 
[self someFunc:searchRequest]; 
} 

Dans ce cas, je me suis aperçu que le corps de le bloc est exécuté dans un thread séparé, ce qui entraîne une perte de données. Je veux que toutes les actions soient effectuées séquentiellement. Comment faire? Merci!

Répondre

1

Si vous souhaitez que someFunc: renvoie une valeur, utilisez dispatch_semaphore_t pour bloquer le thread appelant jusqu'à ce que la requête soit terminée et affectez la valeur de retour à une variable qualifiée __block.

Vous pouvez également modifier someFunc: pour prendre un bloc comme argument supplémentaire qui serait appelé à la fin de la requête.

- (void)someFunc:(NSString *)searchRequest completion:(void(^)(id result))completion { 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 
    [[session dataTaskWithRequest:request 
      completionHandler:^(NSData *data,NSURLResponse *response, NSError *error) 
           { 
       completion(data); 
          }] 
    resume]; 
} 
+0

'someFunc:' ne devrait pas retourner une valeur, à l'intérieur 'completionHandler:^(NSData * données, NSURLResponse * réponse, NSError * erreur) { }]' J'analyse du fichier JSON url et magasin valeur dans la propriété de classe. Puis affichez dans tableview. Maintenant, il s'avère que les informations du fichier json ne se chargeront pas car l'analyse est effectuée avec un retard dans un thread séparé. – redisky

+0

Si je comprends bien, le bloc est poussé sur la pile en attente. – redisky

+0

Traitez les données dans le bloc d'achèvement, puis appelez l'achèvement fourni sur le thread principal avec les objets de modèle requis par la vue de table. – willbur1984