2014-10-01 72 views
-1

問題:如何停止所有線程,如果沒有Internet連接

我的應用程序有時需要運行API調用到我的服務器。但是,如果用戶沒有互聯網連接,則應用程序崩潰,因爲沒有返回。我建立了一個名爲連接的函數,如果用戶有互聯網連接,則返回true。

那麼,如何利用這一點,當我運行runAPI方法,檢查連接第一,如果沒有任何比停止所有線程,並提交「沒有網絡連接」,讓用戶知道一個視圖他必須修復他/她的連接。

請記住,其他班級正在調用此類中的runAPI方法。所以說,XYZ類稱爲位於Class API中的runAPI方法。因此,如果沒有連接,我想放棄正在發生的一切,只是簡單地呈現「無互聯網連接」視圖。

func runAPI(request: String) -> NSDictionary { 
    return parseJSON(getJSON(request)) 
} 

func runAPIArray(request: String) -> NSArray { 
    return parseJSONArray(getJSON(request)) 
} 

func getJSON(urlToRequest: String) -> NSData{ 
    return NSData(contentsOfURL: NSURL(string: urlToRequest)) 
} 

func parseJSON(inputData: NSData) -> NSDictionary{ 
    var error: NSError? 
    var boardsDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(inputData, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary 
    return boardsDictionary 
} 

func parseJSONArray(inputData: NSData) -> NSArray{ 
    var error: NSError? 
    var boardsArray: NSArray = NSJSONSerialization.JSONObjectWithData(inputData, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSArray 
    return boardsArray 
} 

func connection() -> Bool { 
    var reach = Reachability.reachabilityForInternetConnection() 
    var networkStatus = reach.currentReachabilityStatus() 
    return networkStatus != NetworkStatus.NotReachable 
} 
+4

我不相信這會工作可靠,因爲您無法預測您決定停止線程(或更準確地說,線程正在執行的操作)時請求將處於什麼狀態。通常,如果出現網絡問題,請求將超時,您所要做的就是處理產生的錯誤。你最好把沒有被返回的東西當作一個合理的事件來處理,並修復崩潰。 – 2014-10-01 18:59:56

+1

爲什麼不使用內置的NSURLConnectionDelegate方法來檢測由於下行連接導致連接何時失敗? 'connection:didFailWithError:'[link](https://developer.apple.com/library/iOS/documentation/Foundation/Reference/NSURLConnectionDelegate_Protocol/index.html#//apple_ref/occ/intfm/NSURLConnectionDelegate/connection:didFailWithError :)會給你一個錯誤,讓你知道更好一點。 [Error Codes](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/index.html#//apple_ref/doc/uid/TP40003793-CH3g-SW40) – MZimmerman6 2014-10-01 19:20:49

回答

0

爲什麼不把整個東西包裝在if/else中? 僞代碼,但是:

if (connection() == YES) 
{ 
    hit API; 
    do whatever; 
} 
else 
{ 
    UIAlertView = "app requires internet conn"; 
} 

這樣,你不會崩潰的風險進行

+0

如果連接在請求的中間死亡會怎麼樣? – 2014-10-01 19:19:17

+0

我可以使用更多的信息來了解你想要完成的事情。我會說你可以將依賴於互聯網的部分封裝在try/catch塊中。這樣至少它不會崩潰。如果你正在從API檢索GET,我沒有看到互聯網連接可能實際上如果在點擊api之前測試它正確地失敗。 – sandman0615 2014-10-01 19:27:10

+1

@ sandman0615連接可能會失敗,原因很多,如Rob的回答中所述。你絕對不應該假設某些東西可以正常工作,特別是在有缺陷的接待區域等等。也就是說,如果通過慢速連接發生的傳輸,API不會返回大量數據(比如說需要5秒才能完成)在這段時間內會發生很多事情。 – MZimmerman6 2014-10-01 19:44:09

3

However, if the user does not have an internet connection the app crashes because nothing gets returned.

然後你有一個bug。僅僅因爲你有聯繫並不意味着你會得到回報。僅僅因爲你回來的東西並不意味着它會完整或合法。 (您可能很容易在請求中失去連接。)沒有任何網絡響應會讓您崩潰。你的代碼必須具有適應性。

如果網絡響應失敗(出於多種原因),那麼您應該處理該失敗。當網絡可達性表明你沒有連接時,你應該顯示你的「無連接」UI。這些完全是分開的問題。

請記住,Network Reachability非常有限。它基本上表示如果您要求系統將嘗試連接到服務器。它絕不承諾連接會成功。可能有防火牆的方式。服務器可能關閉。該服務可能無法響應。只有提出請求才能告訴你請求是否成功。