Valor de retorno para a function dentro de um bloco

Estou usando o AFNetworking para obter dados de um servidor:

-(NSArray)some function { AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { NSArray *jsonArray =[JSON valueForKey:@"posts"]; } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {} } 

Então, o que estou tentando fazer aqui é retornar o jsonArray para a function. Obviamente, o retorno não está funcionando.

    Você não pode usar o bloco de conclusão para criar um valor de retorno para o seu método. O AFJSONRequestOperation faz seu trabalho de forma assíncrona. someFunction vai retornar enquanto a operação ainda está funcionando. O sucesso e o fracasso Blocos são como você obtém valores resultantes para onde eles precisam ir.

    Uma opção aqui é passar o chamador como um argumento para o seu método wrapper para que o bloco de conclusão possa entregar o 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) {} } 

    Você também pode fazer seu chamador criar e passar um bloco para ser executado com sucesso. Em seguida, goFetch: não precisa mais saber quais propriedades existem no chamador.

     - (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) {} } 

    Como outros já disseram, você não pode fazer isso quando estiver lidando com uma chamada assíncrona. Em vez de retornar o Array esperado, você poderia passar um bloco de conclusão como um parâmetro

     typedef void (^Completion)(NSArray* array, NSError *error); -(void)someFunctionWithBlock:(Completion)block { AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { NSArray *jsonArray =[JSON valueForKey:@"posts"]; if (block) block(jsonArray, nil); } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { if (block) block(nil, error); } } 

    Então, onde você chama isso de alguma function. Esse código também fará o tratamento adequado de erros para você.

     [yourClassInstance someFunctionWithBlock:^(NSArray* array, NSError *error) { if (error) { NSLog(%@"Oops error: %@",error.localizedDescription); } else { //do what you want with the returned array here. } }]; 

    Eu enfrentei este tipo de problema e resolvi-o por este método abaixo. Eu vi as respostas acima usando blocos. Mas essa solução era mais adequada naquele momento. A lógica do método é simples. Você precisa enviar o object e seu método como um parâmetro e após o pedido terminar esse método será chamado. Espero que ajude.

     +(void)request:(NSString *)link parameters:(NSDictionary *)params forInstance:(id)instance returns:(SEL)returnValue { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager GET:link parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { [instance performSelector:returnValue withObject: responseObject]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { [instance performSelector:returnValue withObject:nil]; //NSLog(@"Error: %@", error); }]; }