好吧,我发现了一些非常相似的问题的不同答案,但大多数建议使用 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/