Non è possibile utilizzare il blocco di completamento per creare un valore di ritorno per il metodo. Lo AFJSONRequestOperation
funziona in modo asincrono. someFunction
sta per tornare mentre l'operazione è ancora funzionante. Il successo e l'insuccesso I blocchi sono il modo in cui ottieni i valori risultanti dove devono andare.
Un'opzione è quella di passare il chiamante come argomento al metodo wrapper in modo che il blocco di completamento possa consegnare l'array.
- (void)goFetch:(id)caller
{
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
[caller takeThisArrayAndShoveIt:[JSON valueForKey:@"posts"]];
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {}
}
Si può anche fare in modo che il chiamante crei e superi un blocco per essere eseguito in caso di successo. Quindi goFetch:
non ha più bisogno di sapere quali proprietà esistono sul chiamante.
- (void)goFetch:(void(^)(NSArray *))completion
{
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
if(completion) completion([JSON valueForKey:@"posts"]);
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {}
}
fonte
2013-07-14 19:07:37
Non è possibile farlo. Dato che hai a che fare con una chiamata asincrona, il tuo metodo 'some function' tornerà molto prima che ci sia un valore da restituire. – rmaddy
Ti suggerisco di fare un passo indietro e pensare a cosa fa il tuo codice. Presto capirai che ciò che vuoi non ha senso. –
è possibile passare blocchi alla funzione che verrà eseguita in caso di esito positivo o errore. – stosha