我在我的应用程序中有一个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对象作为参数传递是错误的还是有害的?谢谢。
答案 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仍将保留在内存中,而应取消分配