2012-06-22 12 views
7

Necesito encapsular la respuesta de llamadas de AFNetworking dentro de mi propio método mientras estoy escribiendo una biblioteca. Este código de mí se acerca:Envolviendo bloques de falla de éxito desde AFNetworking dentro de un método

MyDevice *devices = [[MyDevice alloc] init]; 
    [devices getDevices:@"devices.json?user_id=10" success:^(AFHTTPRequestOperation *operation, id responseObject) { 

    ... can process json object here ... 

} 

- (void)getDevices:(NSString *)netPath success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
    failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error)) failure { 
    [[MyApiClient sharedDeviceServiceInstance] getPath:[NSString stringWithFormat:@"%@", netPath] 
     parameters:nil success:success failure:failure]; 
} 

Sin embargo, necesito para procesar los datos de objeto JSON devueltos de getPath antes de regresar a getDevices(). He intentado esto:

- (void)getDevices:(NSString *)netPath success:(void (^)(id myResults))success 
     failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error)) failure { 

    [[MyApiClient sharedDeviceServiceInstance] getPath:[NSString stringWithFormat:@"%@", netPath] 
    parameters:nil 
    success:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
    ... can process json object here ... 
    }       
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    ... process errors here ... 
    }]; 
} 

Pero ahora no hay ninguna llamada de vuelta a getDevices(). Entonces, ¿cómo debo procesar el objeto json en getDevices & tener el retorno de bloque al finalizar? Apreciar la ayuda, ya que soy nuevo en los bloques.

Respuesta

10

Eso es realmente fácil de hacer: solo invoque el bloque llamándolo como una función.

- (void)getDevices:(NSString *)netPath 
      success:(void (^)(id myResults))success 
      failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error)) failure 
{ 
    [[MyApiClient sharedDeviceServiceInstance] 
    getPath:netPath 
    parameters:nil 
    success:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
     id myResults = nil; 
     // ... can process json object here ... 
     success(myResults); 
    }       
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     // ... process errors here ... 
     failure(operation, error); 
    }]; 
} 

EDIT:

Basado en el código que envió Creo que la siguiente interfaz sería más claro:

typedef void(^tFailureBlock)(NSError *error); 

- (void)getDevicesForUserID:(NSString *)userID 
        success:(void (^)(NSArray* devices))successBlock 
        failure:(tFailureBlock)failureBlock; 
+0

Gracias phix23! Al agregar "success (myResults);" al bloque de éxito getPath() hace que todo funcione como se espera. Muchas gracias por la respuesta súper rápida. - Dan – Dan

+0

Apreciar los comentarios de claridad, también. Se ha centrado en la funcionalidad, pero incorporará estas sugerencias en la versión final. – Dan

+0

Quiero esta función getDevices rápidamente. ¿Se puede convertir rápidamente? –

Cuestiones relacionadas