Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在重新加载TableView之前设置模型数据_Ios_Swift_Closures_Tableview_Codable - Fatal编程技术网

Ios 如何在重新加载TableView之前设置模型数据

Ios 如何在重新加载TableView之前设置模型数据,ios,swift,closures,tableview,codable,Ios,Swift,Closures,Tableview,Codable,TableView在设置模型数据(topRatedModel)之前重新加载,因此模型保持为零。我用了主踏板,但没用。我怎样才能解决这个问题?您可以在以下位置查看我的代码: (主分支是最新的) 编辑:我错误地建议将异步更改为同步。这是错误的,因为它可能会导致@Paulw11指出的主线程阻塞 我能想到的一个解决方案是使用DispatchGroup或dispatch信号量。我个人对DispatchGroups比较熟悉,因此我将为您留下一些关于如何实现它的伪代码: override func viewD

TableView在设置模型数据(topRatedModel)之前重新加载,因此模型保持为零。我用了主踏板,但没用。我怎样才能解决这个问题?您可以在以下位置查看我的代码: (主分支是最新的)


编辑:我错误地建议将异步更改为同步。这是错误的,因为它可能会导致@Paulw11指出的主线程阻塞

我能想到的一个解决方案是使用DispatchGroup或dispatch信号量。我个人对DispatchGroups比较熟悉,因此我将为您留下一些关于如何实现它的伪代码:

override func viewDidLoad() {
    super.viewDidLoad()
    
    self.tableRegister()

    let dispatcher = DispatchGroup()

    //for every function that you want to wait for you make an dispatcher.enter()
    dispatcher.enter()
    self.viewModel.getTopRatedData(completion: { [weak self] response in
        if let _ = self {return}
        self!.topRatedModel = response
    }, completionHandler: { [weak self] error in
         if let _ = self {
             // when each of the functions has finished running you can write a dispatcher.leave()
             dispatcher.leave()
             return
         }
    })
    
    // This code will wait for all dispatcher.leaves() to run in order to execute the following code.
    dispatcher.notify(.main){
        self.tableView.reloadData()
    }
   
}

我希望我能帮上一点忙。如果您需要更多说明,我很乐意为您提供帮助。

一旦所有数据加载完毕,您需要重新加载表视图。代码现在在这些网络操作仍在运行时重新加载表视图

现在,您有三个网络操作,您不想重新加载,直到它们全部完成,并且您不知道它们将以什么顺序完成

在这里你可以用a来帮助你

使用
DispatchGroup
上的
notify
可以在调度组变为空时执行一些代码

您在处理
弱self
时也有一些错误-如果self不是nil,代码将返回。你想要相反的结果

override func viewDidLoad() {
        super.viewDidLoad()
        
        self.tableRegister()

        let dispatchGroup = DispatchGroup()
        

        dispatchGroup.enter()
        self.viewModel.getTopRatedData(completion: { [weak self] response in
            if let self = self else {
                self.topRatedModel = response               
            }
            dispatchGroup.leave()
        }, completionHandler: { [weak self] error in
             dispatchGroup.leave()
        })
        
        dispatchGroup.enter()
        self.viewModel.getNowPlayingData(completion: { [weak self] response in
            if let self = self {
                self.nowPlayingModel = response
            }
            dispatchGroup.leave()
        }, completionHandler: { [weak self] error in
            dispatchGroup.leave()
        })
        
        self.viewModel.getPopularData(completion: { [weak self] response in
            if let self = self {
                self.popularModel = response
            }
            dispatchGroup.leave()
        }, completionHandler: { [weak self] error in
            dispatchGroup.leave()
        })
        
        dispatchGroup.notify {
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
       
    }

从样式的角度来看,我会使用
结果
类型,或者至少使用接受
(响应?、错误?
的闭包,而不是使用两个闭包。

您肯定不想使用
sync()
-您可能会阻塞主线程。它也不会工作,因为没有与异步网络任务同步,谢谢!我不知道。我会尽量对未来的回应有所了解,并将编辑此回复。我的意思是,我不是非常确定,而是说,对不起。
override func viewDidLoad() {
        super.viewDidLoad()
        
        self.tableRegister()

        let dispatchGroup = DispatchGroup()
        

        dispatchGroup.enter()
        self.viewModel.getTopRatedData(completion: { [weak self] response in
            if let self = self else {
                self.topRatedModel = response               
            }
            dispatchGroup.leave()
        }, completionHandler: { [weak self] error in
             dispatchGroup.leave()
        })
        
        dispatchGroup.enter()
        self.viewModel.getNowPlayingData(completion: { [weak self] response in
            if let self = self {
                self.nowPlayingModel = response
            }
            dispatchGroup.leave()
        }, completionHandler: { [weak self] error in
            dispatchGroup.leave()
        })
        
        self.viewModel.getPopularData(completion: { [weak self] response in
            if let self = self {
                self.popularModel = response
            }
            dispatchGroup.leave()
        }, completionHandler: { [weak self] error in
            dispatchGroup.leave()
        })
        
        dispatchGroup.notify {
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
       
    }