如果没有Internet连接,如何停止所有线程

时间:2014-10-01 18:44:55

标签: ios xcode networking swift

问题:

我的应用有时需要对我的服务器运行API调用。但是,如果用户没有互联网连接,则应用程序崩溃,因为没有返回任何内容。我已经构建了一个名为 connection 的函数,如果用户有互联网连接,则返回true。

那么我如何使用它,当我运行 runAPI 方法时,首先检查连接,如果没有任何停止所有线程并显示“无Internet连接”的视图所以用户知道他必须修复他/她的连接。

请记住,其他类在此类中调用 runAPI 方法。所以说类XYZ调用位于类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
}

2 个答案:

答案 0 :(得分:3)

  

但是,如果用户没有互联网连接,则应用程序崩溃,因为没有返回任何内容。

然后你有一个bug。仅仅因为你有一个连接并不意味着你会得到回报。仅仅因为你得到回报并不意味着它将是完整的或合法的。 (您可能很容易在请求中间丢失连接。)没有任何类型的网络响应会让您崩溃。您的代码必须具有弹性。

如果网络响应失败(由于多种原因),那么您应该处理该失败。当网络可访问性指示您没有连接时,您应显示“无连接”UI。这些是完全不同的问题。

请注意,网络可达性非常有限。它基本上表示如果您要求,系统将尝试连接到服务器。它绝不承诺连接会成功。路上可能有防火墙。服务器可能已关闭。该服务可能无法响应。只有发出请求才能告诉您请求是否会成功。

答案 1 :(得分:0)

为什么不将整件事包装在if / else中? 伪代码,但是:

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

这样你就不会冒险崩溃