2012-06-22 7 views
7

Potrzebuję enkapsulacji odpowiedzi z wywołania AFNetworking w mojej własnej metody podczas pisania biblioteki. Ten kod pobiera mi bliski:Blokowanie niepowodzenie bloki z AFNetworking w ramach metody

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

Jednak muszę przetwarzania danych obiekt JSON zwracane z getPath przed powrotem do getDevices(). Próbowałem to:

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

Ale teraz nie ma połączenia z powrotem do getDevices(). Jak mogę przetworzyć obiekt Json w getDevices & po powrocie bloku po zakończeniu? Doceń pomoc, ponieważ jestem nowy w blokach.

Odpowiedz

10

To naprawdę proste: wystarczy wywołać blok, nazywając go jak funkcję.

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

oparciu o kodzie zamieszczonych myślę następujący interfejs będzie bardziej jasne:

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

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

Dziękuję phix23! Dodając "sukces (myResults);" do bloku sukcesu getPath() sprawia, że ​​wszystko działa zgodnie z oczekiwaniami. Wielkie dzięki za super szybką odpowiedź. - Dan – Dan

+0

Doceń również komentarze klarowności. Koncentruję się na funkcjonalności, ale uwzględnię te sugestie w ostatecznej wersji. – Dan

+0

Chcę, aby funkcja getDevices była szybka. Możesz ją przekonwertować na szybką –

Powiązane problemy