Mã của bạn không làm bất cứ xử lý lỗi. Nhưng nó có thể (và nếu dữ liệu này đến từ một dịch vụ web, sẽ) thất bại theo nhiều cách.
- Bạn phải đảm bảo rằng dữ liệu của bạn đối tượng thực sự tồn tại
- Bạn phải chắc chắn rằng đối tượng dữ liệu có thể được chuyển đổi sang JSON
- Bạn phải chắc chắn rằng JSON thực sự chứa một từ điển
Bạn nên sử dụng Swifts cast có điều kiện và đó là khả năng ràng buộc tùy chọn.
Ràng buộc tùy chọn if let JSONData = JSONData
kiểm tra xem JSONData không phải là không. Các lực unwrap (JSONData!
) bạn sử dụng có thể sụp đổ nếu không có dữ liệu có thể được nhận.
Ràng buộc tùy chọn if let json = NSJSONSerialization.JSONObjectWithData
kiểm tra xem dữ liệu có thể được chuyển đổi thành đối tượng JSON hay không. Cast có điều kiện as? NSDictionary
kiểm tra xem đối tượng JSON có thực sự là từ điển hay không. Hiện tại, bạn không sử dụng các kiểm tra này, bạn sẽ truyền các đối tượng dưới dạng NSDictionary. Mà sẽ sụp đổ, nếu đối tượng không phải là json hợp lệ, hoặc nếu nó không phải là một từ điển.
Tôi muốn giới thiệu một cái gì đó như thế này:
var error: NSError?
if let JSONData = JSONData { // Check 1
if let json: AnyObject = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &error) { // Check 2
if let jsonDictionary = json as? NSDictionary { // Check 3
println("Dictionary received")
}
else {
if let jsonString = NSString(data: JSONData, encoding: NSUTF8StringEncoding) {
println("JSON String: \n\n \(jsonString)")
}
fatalError("JSON does not contain a dictionary \(json)")
}
}
else {
fatalError("Can't parse JSON \(error)")
}
}
else {
fatalError("JSONData is nil")
}
Bạn có thể kết hợp kiểm tra 2 và 3 vào một dòng và kiểm tra xem NSJSONSerialization có thể tạo một NSDictionary trực tiếp:
var error: NSError?
if let JSONData = JSONData { // Check 1.
if let JSONDictionary = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &error) as? NSDictionary { // Check 2. and 3.
println("Dictionary received")
}
else {
if let jsonString = NSString(data: JSONData, encoding: NSUTF8StringEncoding) {
println("JSON: \n\n \(jsonString)")
}
fatalError("Can't parse JSON \(error)")
}
}
else {
fatalError("JSONData is nil")
}
Hãy chắc chắn rằng để thay thế fatalError
với xử lý lỗi thích hợp trong mã sản xuất của bạn
Nguồn
2015-03-17 06:39:16
Bạn có thể đăng một số mã cho biết cách đối tượng NSData của bạn được khai báo và vị trí/cách bạn đang khởi tạo đối tượng đó. – gagarwal