2012-06-22 9 views
7

Ho bisogno di incapsulare la risposta da AFNetworking chiamate all'interno del mio metodo mentre sto scrivendo una libreria. Questo codice mi si avvicina:Blocchi di interruzione riuscita riuscita da AFNetworking all'interno di un metodo

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]; 
} 

Tuttavia, ho bisogno di elaborare i dati oggetto JSON restituiti da getPath prima di tornare a getDevices(). Ho provato questo:

- (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 ... 
    }]; 
} 

ma ora non c'è nessuna chiamata di nuovo a getDevices(). Quindi, come si elabora l'oggetto json in getDevices & il completamento del blocco è completato? Apprezzo l'aiuto, visto che sono nuovo per i blocchi.

risposta

10

Questo è veramente facile da fare: basta richiamare il blocco chiamandolo come una funzione.

- (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:

In base al codice che avete inviato Penso che la seguente interfaccia sarebbe più chiaro:

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

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

Grazie phix23! Aggiungendo "successo (myResults);" al blocco di successo getPath() fa funzionare tutto come previsto. Mille grazie per la risposta super veloce. - Dan – Dan

+0

Apprezza anche i commenti di chiarezza. Ti sei concentrato sulla funzionalità, ma incorporerai questi suggerimenti nella versione finale. – Dan

+0

Voglio questa funzione getDevices in swift. Puoi convertirla in swift –

Problemi correlati