2012-02-12 68 views
23

我在我的應用程序中使用AFNetworking爲每個請求(如登錄,從網址獲取數據等)。以此爲例:用戶點擊登錄按鈕並且沒有連接,如何即時顯示UIAlertView表示錯誤? 只有的方式是等待請求超時並執行failure塊?沒有辦法立即檢查是否存在連接?AFNetworking和沒有互聯網連接方案

謝謝!

回答

57

由於0.9,AFHTTPClient實際上有內置的網絡可達性(一個簡單的界面,蘋果的上述可達代碼)。只要包含SystemConfiguration框架並使用-setReachabilityStatusChangeBlock:指定可達性狀態更改時的響應。

+1

嗨mattt和謝謝你的回覆。但是你的建議是在使用互聯網的每個**方法之前檢查互聯網連接的當前狀態,並且如果沒有連接顯示警報, – 2012-02-13 05:22:18

+3

不,完全沒有。 'AFHTTPClient'監視可達性的變化並在發生時執行指定的塊。該塊有一個參數,它是否是'baseURL'可達的布爾值。 – mattt 2012-02-13 05:33:05

+1

我已經將子類'AFHTTPClient'並且我已經用'NSLog(@「test」)'覆蓋了'-setReachabilityStatusChangeBlock:',但是這個語句永遠不會被執行。爲什麼? – 2012-02-15 05:01:07

0

如何使用Reachability?

您可以檢查是否有試圖連接你這樣做之前,一個似是而非的理由。

看起來像Apple Sample Project for Reachability顯示如何獲得初始狀態。

+0

對於任何情況下可達沒有返回,不會將任何套接字I/O失敗,立即嗎? – smparkes 2012-02-12 23:04:27

+0

是的,這就是Reachability的工作原理,但它提供了額外功能,例如在可達性更改時接收通知的功能 - 中斷,而不是輪詢。 – 2012-02-12 23:18:13

+0

對不起,亞當,但如果網絡沒有使用,但設備已連接,我檢查網絡狀態,可達性告訴我,我沒有任何關係。這個答案解釋了我會說更好的方式:http://stackoverflow.com/a/9186073/719127 – 2012-02-12 23:22:35

2

也許你可以使用「Reachability」來確定設備是否連接到網絡。 以下是Apple Doc的鏈接。 :Reachability

例如:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNetworkChange:) name:kReachabilityChangedNotification object:nil]; 
reachability = [Reachability reachabilityForInternetConnection]; 
[reachability startNotifier]; 
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 
if(remoteHostStatus == NotReachable) { 
    //Your UIAlertView 
} 
28

隨着AFNetworking這些都是一個人爲了充分利用setReachabilityStatusChangeBlock:加入AFNetworing班後要遵循的步驟 -

  1. 添加SystemConfiguration.framework到項目
  2. 在PCH文件添加#import <SystemConfiguration/SystemConfiguration.h>
  3. 假設您在此子類中擁有AFHTTPClient的子類,請在init函數中添加以下代碼行 -
 
[self setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
     NSLog(@"changed %d", status); 
     //your code here 
    }]; 
2

我使用AFNetworkingOperationDidFinishNotification。 每次HTTP請求將會失敗,警報彈出並告知用戶

- (void)addNetworkObserver 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(HTTPOperationDidFinish:) 
               name:AFNetworkingOperationDidFinishNotification 
               object:nil]; 
} 

- (void)HTTPOperationDidFinish:(NSNotification *)notification 
{ 
    AFHTTPRequestOperation *operation = (AFHTTPRequestOperation *)[notification object]; 
    if (![operation isKindOfClass:[AFHTTPRequestOperation class]]) { 
     return; 
    } 
    if (operation.error) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Connection error" 
                 message:@"Missing connection to the internet" 
                 delegate:nil 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 

     [alert show]; 
    } 
}