2014-04-14 28 views
4

我有一個類「WebAPI」處理所有的Web API調用,該類通過基於異步委託的調用使用NSURLConnection。獲取NSURLConnection響應(來自助手類)在不同類的方法內

當一個對象需要與網絡API進行通信將使用的WebAPI的一個實例,並調用,如下圖所示在簽約的情況下,我把從AppDelegate中如下因素調用所需的方法:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    WebAPI *webAPI = [[WebAPI alloc] init]; 
    [webAPI performLoginWithUserName:@"[email protected]" andPassword:@"password"]; 
} 

問題是,一旦進行了performLoginWithUserName:andPassword調用,代碼就會進行並且在WebAPI.m中實現的委託方法中接收到任何/所有響應。

這是一個真正的問題,因爲我需要能夠獲得響應代碼以及從WebAPI調用發起的類方法中接收到的任何數據。我希望能這樣:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    WebAPI *webAPI = [[WebAPI alloc] init]; 
    WebAPIResponse * webAPIRespnse = [webAPI performLoginWithUserName:@"[email protected]" andPassword:@"password"]; 
} 

哪裏WebAPIResponse類是一個自定義類將包含HTTP狀態代碼和所接收的任何數據。

如果我改變WebAPI.m使用NSURLConnection sendSynchronousRequest,但這並不能讓我接收所有的HTTP代碼,這是可以實現的。

滿足此要求的最佳方式是什麼?

謝謝你的幫助。

+0

由於委託執行的異步性,這是做一個非常奇怪的事情。畢竟,在上面的代碼中,您希望'WebAPIResponse'立即就緒,而您的'WebAPI'仍然處理請求。 IMO更合理的解決方案是在您的WebAPI類中添加對委託對象的支持... – Hless

+0

我不明白做我需要的東西需要NSURLConnection完成並接收響應和數據,它更多隻要信息可用於退貨。 –

回答

2

您可以使用塊來處理響應。 例如:

WebApi.h 
- (void)performLoginWithUsername:(NSString *)userName 
        andPassword:(NSString *)password 
        successBlock:(void(^)(NSData *response))successBlock 
        failureBlock:(void(^)(NSError *error))failureBlock; 

WebApi.m 
@interface WebAPI() 
    @property (nonatomic, copy) void(^authorizationSuccessBlock)(NSData *response); 
    @property (nonatomic, copy) void(^authorizationFailureBlock)(NSError *error); 
@end 

@implementation WebAPI 
- (void)performLoginWithUsername:(NSString *)userName 
        andPassword:(NSString *)password 
        successBlock:(void(^)(NSData *response))successBlock 
        failureBlock:(void(^)(NSError *error))failureBlock { 
    self.authorizationSuccessBlock = successBlock; 
    self.authorizationFailureBlock = failureBlock; 
    // NSURLConnection call for authorization here 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    if (self.authorizationSuccessBlock != nil) { 
     self.authorizationSuccessBlock(data); 
     self.authorizationSuccessBlock = nil; 
    } 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    if (self.authorizationFailureBlock != nil) { 
     self.authorizationFailureBlock(error); 
     self.authorizationFailureBlock = nil; 
    } 
} 

AppDelegate.m 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    WebAPI *webAPI = [[WebAPI alloc] init]; 
    [webAPI performLoginWithUserName:@"[email protected]" andPassword:@"password" successBlock:^(NSData *response) { 
     // Handle result here 
    } failureBlock:^(NSError *error) { 
     // Handle error here 
    }]; 

}

+0

這看起來很有希望!我會放棄這一切,回到你身邊!謝謝。 –

0

更改您的WebAPI類以提供其自己的代理接口,或者在異步連接完成時調用請求上的完成塊。

+0

我曾考慮過實現委託,但這隻允許我在調用類而不是調用方法內接收響應。響應/數據需要在從webAPI調用的方法中消耗。 –

+0

然後您需要更改該方法。將功能移到另一個方法。在等待時向用戶顯示一個活動指示器+取消按鈕。你不應該使用同步調用。 – Wain

+1

在這種情況下,塊肯定會阻塞,塊包含對它們被定義的方法範圍的引用。 – Hless