我有一个带有jsonserialization的webrequest,之后是一个for in fetch进程。
整个过程大约需要5-7秒。
之后,我想在Viewcontroller中引用我的tableview。
函数的方案如下所示。

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过程完成后,如何调用reload函数?因为在返回之后,函数不再执行任何操作。
当fetchNewData()函数完成时,没有其他函数会“知道”。
谢谢你的帮助!
@IBAction func updateButton(_ sender: Any) {

     fetchNewData()

    }

根据Phillipps的建议,我不得不稍微修改@IBAction函数。
但现在它开始工作了。令人惊叹的!
这里是完整的工作版本:
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()
            }

 }

最佳答案

开始吧。这将是模糊的,因为我正在猜测我看不到的代码,但您可以将其转换为您自己的需要。
更改fetch函数,使其接受闭包作为参数:

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是视图控制器。这意味着不需要在fetch中创建第二个(无用的)控制器。

关于swift - WebRequest session 中的完成处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44573642/

10-13 07:27