ios - 在没有互联网时防止 JSONSerialization 崩溃我的应用程序的最佳方法?

标签 ios swift web-services

好吧,我发现了一些非常相似的问题的不同答案,但大多数建议使用 if 语句或 try/catch block ,而我的代码同时包含这两种方法。我正在调用返回 JSON 的 Web 服务,我使用 JSONSerialization 将其提取出来进行解析。正如标题所示,当没有互联网时,我的应用程序会崩溃并烧毁,我希望有人能告诉我处理此问题的最佳方法。我会把我的方法放在下面:

func getCategories() {
    activityIndicator?.startAnimating()
    tableView.isUserInteractionEnabled = false
    categoryArray = []
    let configuration = URLSessionConfiguration.default
    configuration.requestCachePolicy = NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData
    let getQuizTitlesURL = URL(string: "https://myservice.com/my/directory/selectcategories.php")
    URLSession.shared.dataTask(with: getQuizTitlesURL! as URL, completionHandler: {(data, response, error) in

        do{
            if let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSArray {

                var name:String
                var categoryId:Int
                var quizCount:Int

                for index in 0...parsedData.count-1 {
                    let aObject = parsedData[index] as! [String : AnyObject]
                    name = (aObject["Name"] as? String)!
                    quizCount = Int(aObject["Count"] as! String)!
                    categoryId = (Int((aObject["ID"] as? String)!)!)
                    let category:Category = Category(name: name, quizCount: quizCount, categoryId: categoryId)
                    self.categoryArray.append(category)
                }
            }

            if let HTTPResponse = response as? HTTPURLResponse {
                print(HTTPResponse)
                let statusCode = HTTPResponse.statusCode
                if statusCode == 200 {
                    print("Success")
                }
            }
        }catch let error as NSError {
            print(error)
        }
        DispatchQueue.main.async {
            self.tableView.reloadData()
            self.activityIndicator?.stopAnimating()
            self.tableView.isUserInteractionEnabled = true
        }
    }).resume()
}

最佳答案

永远不要使用强制解包。

guard let data = data else { 
    // no data
    return
}
do {
    if let parsedData = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSArray {
. . .

此外,正如@joaofs 所说,请在请求之前检查网络可用性。即使您检查了这一点,在请求-响应期间一切皆有可能。就像网络在请求后立即断开连接。

关于ios - 在没有互联网时防止 JSONSerialization 崩溃我的应用程序的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43461130/

相关文章:

.net - Web服务日志记录

ios - 使用 Computed 变量和 Snapkit 时 : No common superview between views

iphone - NSSet如何随机提取对象?

ios - Xcode 中使用较低的 4.0.3 版本而不是 5.0.1 的 Swift build设置未强制执行

Swift:节点离开 SKCameraNode View 时的事件?

C#:如何以编程方式检查 Web 服务是否已启动并正在运行?

ios - 无法从 Swift 3 中的 Userdefaults 检索字典数据

ios - 如何从 swift 中的函数返回 UIImage?

arrays - 在 UITableView 的现有部分内添加单个值

iphone - 如何在 iOS 版 Phone Gap 中使用 WSDL Web 服务?