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() 
      } 

} 
+0

随着你的其他问题,这:'var view = ViewController()'不会帮助你。这会创建一个**新的** ViewController,它不在屏幕上,并且对要更新的表一无所知。什么对象调用'fetchNewData'? (即在哪里使用容器数组?) –

+0

谢谢,我刚刚更新了代码。我必须纠正自己,而不是容器追加结果,它的dataArray。这个dataArray显示在一个tableview中。 –

+0

是否有解决方案来访问重载功能,这是(而且必须)在ViewController类? –

这里是一个开始。它会模糊,因为我正在猜测我看不到的代码,但是您可能可以将其转换为您自己的需要。

改变,因此,它需要一个闭包作为参数的提取功能:

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”。 –