Résultat du return du bloc d'achèvement

J'essaie donc de build une couche au-dessus de l'API Twitter (entre autres) pour un projet et je dois find un moyen de renvoyer le résultat des actions Twitter à la couche d'abstraction.

En ce moment, ma configuration est quelque chose comme ceci, par exemple:

-(NSDictionary *)sendTweet:(Tweet *)tweet { __block NSMutableDictionary *responseDictionary; NSLog(@"Sending tweet"); NSMutableDictionary *twitterRequestDictionary = [[NSMutableDictionary alloc] init]; [twitterRequestDictionary setObject:tweet.tweetBody forKey:@"status"]; TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithSsortingng:@"https://api.twitter.com/1/statuses/update.json"] parameters:twitterRequestDictionary requestMethod:TWRequestMethodPOST]; [request setAccount:self.userAccount]; [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil]; NSLog(@"Response dictionary: %@", responseDictionary); return responseDictionary; }]; 

}

Mais parce que la méthode 'performRequestWithHandler:' renvoie 'void' I la dernière ligne provoque une erreur.

J'ai également essayé de placer l'instruction 'return' en dehors du bloc et de verrouiller l'exécution de la section de code du bloc après avoir découvert cet article: http://omegadelta.net/2011/05/10/how-to-wait- for-ios-methods-with-completion-blocks-à-finir

Toujours pas de chance.

J'espère que quelqu'un peut faire la lumière sur cette façon de le faire (ou peut-être suggérer une meilleure méthode pour returnner datatables).

Pourquoi n'utilisez-vous pas aussi un bloc pour returnner la réponse? Quelque chose comme:

 -(void)sendTweet:(Tweet *)tweet withResponseCallback:(void (^)(NSMutableDictionary *responseDictionary))callback { NSLog(@"Sending tweet"); NSMutableDictionary *twitterRequestDictionary = [[NSMutableDictionary alloc] init]; [twitterRequestDictionary setObject:tweet.tweetBody forKey:@"status"]; TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithSsortingng:@"https://api.twitter.com/1/statuses/update.json"] parameters:twitterRequestDictionary requestMethod:TWRequestMethodPOST]; [request setAccount:self.userAccount]; [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { NSMutableDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil]; NSLog(@"Response dictionary: %@", responseDictionary); callback(responseDictionary); }]; } 

Puisque vous utilisez la méthode asynchronous, il est difficile de dire quand votre méthode returnnera datatables. Vous pouvez donc envisager d'autres options pour renvoyer le résultat. Par exemple, il peut être utile de postr une notification, envoyer un message, définir une propriété ou même afficher une vue d'alerte.

En ce qui concerne l'article «exemple de code, je voudrais essayer quelque chose comme le suivant

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSData *data = [self loadDataWithConditionLock]; dispatch_async(dispatch_get_main_queue(), ^{ [self updateUIWithData:data]; }); });