我正在尝试在调试区域显示我的JSON信息,但是我遇到了一个问题,我还没有找到解决方案。
首先,让我显示一下我现在拥有的代码:
BBUpJSON.swift
import Foundation
class BBUpJSON {
func loadBbup(completion: ((AnyObject) -> Void)!) {
var urlString = "http://xxxdsgn.xxxhost.com/json/jnslst.json"
let session = NSURLSession.sharedSession()
let bbupUrl = NSURL(string: urlString)
var task = session.dataTaskWithURL(bbupUrl!){
(data, response, error) -> Void in
if error != nil {
println(error.localizedDescription)
} else {
var error : NSError?
var bbupData = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &error) as! NSArray
var jnslst = [JSONExtrct]()
for jnsextrct in bbupData{
let jnsextrct = JSONExtrct(data: jnsextrct as! NSDictionary)
jnslst.append(jnsextrct)
}
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
dispatch_async(dispatch_get_main_queue()) {
completion(jnslst)
}
}
}
}
task.resume()
}
}
JSONExtrct.swift
import Foundation
class JSONExtrct {
var titulo : String!
var imageUrl : String!
var imageData : NSData?
var imageUrl2 : String!
var imageData2 : NSData?
var imageUrl3 : String!
var imageData3 : NSData?
var marca : String!
var color : String!
var tipo : String!
var ref : Int!
init(data : NSDictionary) {
self.titulo = getStringFromJSON(data, key: "titulo")
let image = data["image"] as! NSDictionary
self.imageUrl = getStringFromJSON(image, key: "image")
let image2 = data["image2"] as! NSDictionary
self.imageUrl2 = getStringFromJSON(image, key: "image2")
let image3 = data["image3"] as! NSDictionary
self.imageUrl3 = getStringFromJSON(image, key: "image3")
self.marca = getStringFromJSON(data, key: "marca")
self.color = getStringFromJSON(data, key: "color")
self.tipo = getStringFromJSON(data, key: "tipo")
self.ref = data["ref"] as! Int
}
func getStringFromJSON(data: NSDictionary, key: String) ->String{
//let info : AnyObject? = data[key]
if let info = data[key] as? String {
return info
}
return ""
}
}
ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let json = BBUpJSON()
json.loadBbup(nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
因此,当我在BBUpJSON.swift文件中的for jnsextrct in bbupData{
处设置断点并运行应用程序时,左侧调试区域显示我有20个值。每次我在调试区域右侧输出中运行po bbupData
时,它只部分显示我JSON文件中的20个值中的3个。当我在同一Swift文件末尾的completion(jnslst)
处添加另一个断点并按下继续程序执行时,我会收到以下错误:Could not cast value of type '__NSCFString' (0x10c3c2c50) to 'NSDictionary' (0x10c3c38d0)
。然后将错误重定向到位于我的JSONExtrct.swift中的let image = data["image"] as! NSDictionary
。
这是尝试提取信息的json文件的链接。
-----更新------
将JSONExtrct.swift中字符串的值修改为:
if let imageUrl = data["image"] as? String {
self.imageUrl = imageUrl
}
if let imageUrl2 = data["image2"] as? String {
self.imageUrl2 = imageUrl2
}
if let imageUrl3 = data["image3"] as? String {
self.imageUrl3 = imageUrl3
}
我在 BBUpJSON.swift 中添加了相同的断点以查看结果。从断点 for jnsextrct in bbupData{
开始,当我在输出区域中键入 po bbupData
时,它仍然显示出20个值中的相同3个值(不知道是否应该这样显示)。当我继续执行程序到 completion(jnslst)
时,它不会显示之前的错误,但在键入 po jnslst
时,它会显示以下输出结果:
(lldb) po jnslst
[BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct, BonBonUp.JSONExtrct]
当我在最后一个括号处继续添加一个断点时,它会显示以下错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
并将错误重定向到 completion(jnslst)
,显示 Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
。
更新2
断点行1
断点行2
看起来它只通过jnsextrct
读取一个值并将其返回给jnslst
。然后当我在下一个截图中添加另一个断点时,它就会进入下一个值。当我在第二个截图中输入po jnslst
时,它只返回一个[BonBonUp.JSONExtrct]
而不像之前更新中的20个。
更新3
已经将CollectionView
添加到了Main.StoryBoard
,但在尝试将JSON信息(还没有图片)上传到每个网格时,我遇到了以下错误。在JnsGridController.swift下,为了从我的JSON
文件中接收信息,我必须创建一个新方法,回调为didLoadJns
。这是代码的一部分:jns = [JsonExtrct]()
let json = JnsJson()
json.loadJns(didLoadJns)
}
func didLoadJns(jns: [JsonExtrct]){
self.jns = jns
collectionView.reloadData()
在
json.loadJns(didLoadJns)
中,didLoadJns
在我添加func
方法之前是nil
的,但现在我遇到了以下错误:Cannot invoke 'loadJns' with an argument list of type '(([JsonExtrct]) -> ())'
。此外,在JnsJson.swift中,自从我在JnsGridController中添加了回调函数后,它将从
AnyObject
接收数组,而不是从JsonExtrct
,因此我将函数方法从func loadJns(completion: ((AnyObject) -> Void)!) {
更改为func loadJns(completion: ((JsonExtrct) -> Void)!) {
,现在我遇到了与JnsGridController中的错误类似的错误:Cannot invoke 'dispatch_async' with an argument list of type '(dispatch_queue_t!, () -> _)'
。
?
(jnslst)一行中,我不得不添加一个额外的?
,因为如果我没有添加?
或!
,它会给我一个错误。关于在jnslst.append(jnsextrct)
中添加断点,我将会在我的问题中发布两个值截图。 - wlmrlsda