Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NSURLSession有时返回数据,但有时不返回';iOS 9-Swift 2.0_Ios_Swift_Ios9_Nsurlsession - Fatal编程技术网

NSURLSession有时返回数据,但有时不返回';iOS 9-Swift 2.0

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]

我正在开发一个基于从指定URL请求的JSON对象的应用程序,但有时(不是每次)我没有得到任何结果
我将展示一些代码片段,这些代码片段有助于确定这个简单的(?)问题
我的
类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()
    }
}