2012-06-22 24 views
7

Tôi cần đóng gói phản hồi từ các cuộc gọi AFNetworking trong phương thức của riêng tôi khi tôi đang viết thư viện. Mã này giúp tôi đóng:Gói các khối thất bại thành công từ AFNetworking trong một phương thức

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

Tuy nhiên, tôi cần xử lý dữ liệu đối tượng json được trả về từ getPath trước khi trở về getDevices(). Tôi đã thử điều này:

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

Nhưng bây giờ không có cuộc gọi trở lại để getDevices(). Vậy làm cách nào để xử lý đối tượng json trong getDevices & có hoàn trả khối khi hoàn thành? Đánh giá cao sự trợ giúp, vì tôi mới làm quen với các khối.

Trả lời

10

Điều đó thực sự dễ thực hiện: Chỉ cần gọi khối bằng cách gọi nó như một hàm.

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

Dựa trên mã bạn được đăng Tôi nghĩ rằng giao diện sau sẽ rõ ràng hơn:

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

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

Cảm ơn bạn phix23! Bằng cách thêm "thành công (myResults);" cho khối thành công getPath() làm cho mọi thứ hoạt động như mong đợi. Cảm ơn rất nhiều vì phản ứng cực nhanh. - Dan – Dan

+0

Đánh giá cao nhận xét rõ ràng. Đã tập trung vào chức năng, nhưng sẽ kết hợp các đề xuất này vào phiên bản cuối cùng. – Dan

+0

Tôi muốn chức năng getDevices này nhanh chóng. Bạn có thể chuyển đổi nó thành nhanh chóng –

Các vấn đề liên quan