NSURLSession有时返回数据,但有时不返回';iOS 9-Swift 2.0
我正在开发一个基于从指定URL请求的JSON对象的应用程序,但有时(不是每次)我没有得到任何结果NSURLSession有时返回数据,但有时不返回';iOS 9-Swift 2.0,ios,swift,ios9,nsurlsession,Ios,Swift,Ios9,Nsurlsession,我正在开发一个基于从指定URL请求的JSON对象的应用程序,但有时(不是每次)我没有得到任何结果 我将展示一些代码片段,这些代码片段有助于确定这个简单的(?)问题我的类MyTestClass中有一个名为“Data”(var Data:[String]=[])的数组和以下函数: func loadData(onComplete: ([String]) -> ()) { // Declaring a local array var Local:[String]
我将展示一些代码片段,这些代码片段有助于确定这个简单的(?)问题
我的
类MyTestClass
中有一个名为“Data”(var Data:[String]=[]
)的数组和以下函数:
func loadData(onComplete: ([String]) -> ()) {
// Declaring a local array
var Local:[String] = []
// Preparing JSON request
let address = "<URL goes here>"
let url = NSURL(string: address)
let request = NSURLRequest(URL: url!)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { (data, response, error) in
if (data?.length > 0 && error == nil) {
let responseData = data as NSData!
if responseData == nil {
// Presenting some alert
} else {
let jsonObject: AnyObject? = try? NSJSONSerialization.JSONObjectWithData(responseData!, options: NSJSONReadingOptions.MutableContainers)
if jsonObject == nil {
// Presenting some alert
} else {
let json: NSArray = jsonObject as! NSArray
for (var i = 0; i < json.count; i++) {
if let obj = json[i] as? NSDictionary {
if let m = obj["m"] as? String {
if m != "Unknown" {
Local.append(m)
}
}
}
}
onComplete(Local)
}
}
} else if error != nil {
NSLog("Error: %@", error!)
}
}
// Starting task
task.resume()
}
我正在使用此解决方案(函数100%相同[CTRL+C/CTRL+V])在我的每个ViewController中,我的层次结构如下所示:
表1->表2->表3
表1工作正常,没有问题,每次显示结果都很正常,表2大部分时间工作正常(有时很少显示没有结果),但表3有80%的时间都很疯狂
在iOS 9之前,我使用同步调用,没有问题,因为它是一个小应用程序,所以我很生气,因为这件事发生在我身上,但是现在我甚至不知道如何使用这个
会话。dataTaskWithRequest…
东西。您需要使用dispatch async并在loadData块完成后重新加载表视图的数据
您应该调用
tableView.reloadData()
(从主队列)在将所有这些字符串追加到数组后,请求完成
loadData { (d) in
dispatch_async(dispatch_get_main_queue()) {
for dat in d {
self.Data.append(dat)
}
self.tableView.reloadData()
}
}
为了记录在案,您已经取消了同步网络调用,这太棒了。同步调用可能很容易,但可能会导致问题。谢谢,现在可以使用了,但我还有一个类似的问题。如果我在处理结构呢?如何正确加载它们<代码>结构信息{var x=String()var y=String()var z=String()}我使用与上面相同的方法从web获取数据并通过onComplete传递,但数据似乎丢失了。过程大体相同。只要确保调用
reloadData
(并在主队列上执行所有这些操作),就可以了。顺便说一下,我可能会建议结构信息{var x:String var y:String var z:String}
,然后使用信息(x:a,y:b,z:c)
(其中a
,b
,和c
将是您的字符串)。如果这不起作用,请使用创建新问题。并且您需要更改局部变量的类型,以将结构返回为旁白,我建议遵循Cocoa命名约定,并以小写字母开始所有变量。此外,“数据”也有误导性,因为按照惯例,这种名称往往与NSData
对象一起使用。我可能会建议使用strings
(或者更好的是,建议那些字符串是什么类型的)而不是Data
。
loadData { (d) in
dispatch_async(dispatch_get_main_queue()) {
for dat in d {
self.Data.append(dat)
}
self.tableView.reloadData()
}
}