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()
}
}
郑重声明,您已经停用同步网络调用真是太好了。同步调用可能很容易,但它们可能会导致问题。
我正在开发一个基于从指定 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()
}
}
郑重声明,您已经停用同步网络调用真是太好了。同步调用可能很容易,但它们可能会导致问题。