【发布时间】:2014-11-08 14:33:22
【问题描述】:
我正在尝试从我网站上的 JSON 中提取信息。这样做时,如果连接出现错误,它应该返回该错误并将其记录到控制台。我遇到的问题是,如果我打开飞机更多或失去信号,错误:fatal error: unexpectedly found nil while unwrapping an Optional value 使应用程序崩溃。当我为简单地记录错误设置条件时,为什么它会返回这个?提前谢谢!
我不确定为什么没有记录错误并阻止应用程序崩溃。任何指针都会有所帮助。
JSONLoader.swift
import Foundation
var arrayOfMeals: [Meal] = [Meal]()
var weekDayArray = ["monday"]
func getJSON(urlToRequest: String) -> NSDictionary {
var url: NSURL = NSURL(string: urlToRequest)!
var jsonRequest: NSURLRequest = NSURLRequest(URL: url)
var jsonResponse: AutoreleasingUnsafeMutablePointer<NSURLResponse?> = nil
var error: NSError?
var dataValue: NSData = NSURLConnection.sendSynchronousRequest(jsonRequest, returningResponse: jsonResponse, error:&error)!
if error? == nil {
var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataValue, options: NSJSONReadingOptions.MutableContainers , error: &error) as NSDictionary
NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
if error? == nil {
return jsonResult
}
else {
return NSDictionary(object: "Error: Something with parsing went wrong :(", forKey: "error")
}
}
else {
return NSDictionary(object: "Error: There was an error with your connection :(", forKey: "error")
}
}
func loadJSON(jsonDictionary: NSDictionary) {
for days in weekDayArray{
var resultsArray = jsonDictionary[days] as NSArray
for obj: AnyObject in resultsArray{
let breakfast = (obj.objectForKey("breakfast")! as String)
let lunch = (obj.objectForKey("lunch")! as String)
let dinner = obj.objectForKey("dinner")! as String
let dateString = obj.objectForKey("dateString")! as String
let dayOfWeek = obj.objectForKey("dayOfWeek")! as String
let newMeal = Meal(breakfast: breakfast, lunch: lunch, dinner: dinner, dayOfWeek: dayOfWeek, dateString: dateString)
if theDays(newMeal.dateString) >= 0 {
arrayOfMeals.append(newMeal)
}
}
}
}
我希望函数 getJSON 建立到站点的 NSURLConnection,解析 JSON 日期,并返回一个 NSDictionary。如果连接中存在错误,则建立错误案例,然后返回字典,其中包含解释错误的值。解析 JSON 文件时会发生额外的错误情况,并返回具有类似错误的 NSDictionary。
我希望函数 loadJSON 能够创建对象 Meal 的实例,我将其定义为具有早餐、午餐、晚餐、日期和星期几的属性。这个实例的值是函数getJSON返回的NSDictionary的结果。如果这一天是未来,请将其附加到我的arrayOfMeals。否则,忽略该实例。
MealViewController
override func viewDidLoad() {
super.viewDidLoad()
var req = getJSON("http://www.seandeaton.com/meals/Mealx")
loadJSON(req)
}
MealModel.swift - 创建餐点实例
class Meal {
let breakfast: String
let lunch: String
let dinner: String
let dayOfWeek: String
let dateString: String
init(breakfast: String, lunch: String, dinner: String, dayOfWeek: String, dateString: String) {
self.breakfast = breakfast
self.lunch = lunch
self.dinner = dinner
self.dayOfWeek = dayOfWeek
self.dateString = dateString
}
}
如何防止应用在建立连接失败并将错误消息记录到控制台时崩溃?再次感谢。
【问题讨论】: