WebRequest会话中的完成处理
问题描述:
我是带有jsonserialization的webrequest,之后是for-in提取过程。整个过程大约需要5-7秒钟的时间。 之后,我想在Viewcontroller中引用我的tableview。 函数的方案如下所示。WebRequest会话中的完成处理
public struct Container {
let name: String
let symbol: String
let rank: String
}
public var dataArray = [Container]()
func fetchNewData() {
var view = ViewController()
// WebbRquest...
// Json serialization...
// the following list is much longer, will take a while...
for items in json {
let name = items["name"] as? AnyObject;
let symbol = items["symbol"] as? AnyObject;
let rank = items["rank"] as? AnyObject;
let result = Container(name: name! as! String, symbol: symbol! as! String,rank: rank! as! String)
dataArray.append(result)
}
// Now, after alle the work is done, i want to reload the tableview in Viewcontrller:
view.reload()
// Here i´m getting error, because nothing will be executed after return.
}
我如何可以调用重载函数时,WebRequest的过程完成后?因为在返回之后,函数不再执行任何操作。 当fetchNewData()函数完成时,没有其他函数会“知道”。 感谢您的帮助!
@IBAction func updateButton(_ sender: Any) {
fetchNewData()
}
据菲利浦斯的建议,我不得不修改@IBAction FUNC一点点。 但现在它工作。真棒! 这里完整的工作版本:
public struct Container {
let name: String
let symbol: String
let rank: String
}
public var dataArray = [Container]()
func fetchNewData(completion:@escaping ([Container])->()) {
var view = ViewController()
// WebbRquest...
// Json serialization...
// the following list is much longer, will take a while...
for items in json {
let name = items["name"] as? AnyObject;
let symbol = items["symbol"] as? AnyObject;
let rank = items["rank"] as? AnyObject;
let result = Container(name: name! as! String, symbol: symbol! as! String,rank: rank! as! String)
dataArray.append(result)
}
completion(dataArray)
}
这是actionFunc:
@IBAction func upDateButton(_ sender: Any) {
let data = dataArray
fetchNewData() {_ in (data)
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
答
这里是一个开始。它会模糊,因为我正在猜测我看不到的代码,但是您可能可以将其转换为您自己的需要。
改变,因此,它需要一个闭包作为参数的提取功能:
func fetchNewData(completion:([Container])->()) {
...注意,关闭将接受数据数组时,它的调用。 之后,你有你的JSON解析一切,你再调用关闭:
dataArray.append(result)
}
completion(dataArray)
“魔术师”是在你告诉fetchNewData
它结束时做什么视图控制器。喜欢的东西:
@IBAction func updateButton(_ sender: Any) {
fetchNewData() {(data)
// Save the data where the view controller can use it
self.tableArray = data
// Main queue for UI update
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
注意,封闭是写在视图控制器,所以self
是视图控制器。这意味着无需在获取中创建第二个(无用的)控制器。
+0
完美的解决方案!我只需在调用fetchNewData函数之前创建一个“let data = dataArray”。 –
随着你的其他问题,这:'var view = ViewController()'不会帮助你。这会创建一个**新的** ViewController,它不在屏幕上,并且对要更新的表一无所知。什么对象调用'fetchNewData'? (即在哪里使用容器数组?) –
谢谢,我刚刚更新了代码。我必须纠正自己,而不是容器追加结果,它的dataArray。这个dataArray显示在一个tableview中。 –
是否有解决方案来访问重载功能,这是(而且必须)在ViewController类? –