NSURLSession 有时 returns 数据但有时不 iOS 9 - Swift 2.0

NSURLSession sometimes returns data but sometimes don't iOS 9 - Swift 2.0

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

在 viewDidLoad() 中,我正在执行以下操作:

// Loading data
loadData { (d) in
    for dat in d {
        self.Data.append(dat)
    }
}

我在我的每个 ViewController 中都使用这个解决方案(功能 100% 相同 [CTRL+C / CTRL+V]),我的层次结构如下: 表 1 -> 表 2 -> 表 3

Table1 工作正常,没有问题,每次都能正常显示结果,Table2 大部分时间都工作(有时很少不显示任何结果)但 Table3 大约有 80% 的时间出现问题。

因为发生在我身上的这件事,我很生气,在 iOS 9 之前,我使用同步调用并且没有问题,因为它是一个小应用程序,但现在我什至不知道如何制作它适用于这个 session.dataTaskWithRequest... 东西。

您需要使用 dispatch async 并在完成 loadData 块时重新加载 table 视图的数据

use dispatch async with dataTaskWithRequest

你应该调用 tableView.reloadData()(从主队列)请求完成,在你完成将所有这些字符串附加到你的数组之后。

loadData { (d) in
    dispatch_async(dispatch_get_main_queue()) {
        for dat in d {
            self.Data.append(dat)
        }
        self.tableView.reloadData()
    }
}

郑重声明,您已经停用同步网络调用真是太好了。同步调用可能很容易,但它们可能会导致问题。