传递Self ViewController作为参数?

时间:2019-06-21 22:18:57

标签: ios swift

我在我的应用程序中有一个TableView,并从JSON填充了它,该JSON在DataService类中下载。该DataService类仅执行下载数据并将其保存到数组操作。

在ViewController类中,我还有一个用于存储此数据的数组,该数组在开始时被初始化为空,然后填充了DataService中的数据。由于下载操作完成后,我需要填充数据数组(ViewController类中的一个),因此DataService类需要到达此数组。因此,我决定将ViewController对象本身传递给DataService类,以便它可以用下载的数据填充VC的数组,并重新加载其tableView数据。

所以我的DataService类如下:

var dataArray: [EtkinlikCellData] = []

func fetchData(senderVC: EtkinliklerVC)  {

  // Download & fill dataArray operations

  senderVC.dataArray = self.dataArray // setting sender VC's array
  senderVC.tableView.reloadData() // reloading sender VC's table data

}

在ViewController类中如何使用它:

var dataArray = [EtkinlikCellData]()

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self 
    DataService.instance.fetchData(senderVC: self)

}

我知道,如果我直接在ViewController类中执行提取操作,则不会有任何问题,因为fetchData()方法将到达dataArray和tableView对象本身。但是由于它在另一个类中,因此将ViewController对象作为参数传递是错误的还是有害的?谢谢。

1 个答案:

答案 0 :(得分:0)

唯一的威胁是保留周期,您可以通过像这样弱引用对象来避免这种情况

选项1: //问题模型不应包含任何UI内容

weak var delgate:EtkinliklerVC?
fetchData(senderVC: EtkinliklerVC)  {
 self.delegate = senderVC

 ....
 self.delegate?.dataArray = self.dataArray  
 self.delegate?.tableView.reloadData() 

选项2:

建立完成(推荐)

func fetchData(completion:@escaping:([String] -> ()))   {  
  completion(arr)
}

然后使用它

DataService.instance.fetchData() { [weak self] arr in
 // set it and reload
}

加号:

假设您保持当前代码不变,因为单例仍处于活动状态,这意味着强烈保留了该代码,并将vc对象传递给它,用户打开vc,然后在数据返回之前他在vc中按下了back按钮,因为没有单例和vc之间的弱引用,则vc仍将保留在内存中,而应取消分配