2

所以,我是 VIPER 的新手,并使用该架构构建了简单的 http 请求演示应用程序。我遇到了一个 UI 没有更新的问题,尽管视图中的方法仍然被调用,因为我已经检查了 print("test") 是否已执行并显示在调试控制台上。这是相关代码:

看法 :

  private func getAllContacts(){
        self.contacts = []
        self.hud.show(in: self.view)
        self.presenter?.fetchListContacts()
        print("asd")
        
    }

主持人 :

  func fetchListContacts(){
        print("sdf")
        interactor?.getContacts()
    }

交互者:


   func getContacts(){
        print("123")
        var contacts : [DetailContact] = []
        contacts = \\APICALL
        self.presenter?.listContactFetchSuccess(contacts)
           }

Baxk 到 PResenter :

 func listContactFetchSuccess(_ contacts: [DetailContact]) {
        print("gxx")
        view?.fetchSucceed(contacts: contacts)
    }

返回查看:

     func fetchSucceed(contacts: [DetailContact]) {
        self.contacts = contacts
        self.hud.dismiss()
        self.contactTableView.reloadData()
        print("test")
    }

我的路由器:

  static func createListContactModule() -> ListViewController {
        let view = mainstoryboard.instantiateViewController(withIdentifier: "ListViewController") as! ListViewController
        
        var presenter: ViewToPresenterListProtocol & InteractorToPresenterListProtocol = ListContactPresenter()
        var interactor: PresenterToInteractorListProtocol = ListContactInteractor()
        let router:PresenterToRouterListProtocol = ListContactRouter()
        
        view.presenter = presenter
        presenter.view = view
        presenter.router = router
        presenter.interactor = interactor
        interactor.presenter = presenter
        
        return view
    }
4

1 回答 1

0

进度界面至少关闭了?还是没有任何变化?

我建议您将函数的内容fetchSucceed(contacts: [DetailContact])放入主队列,例如:

func fetchSucceed(contacts: [DetailContact]) {
     DispatchQueue.main.async {
        self.contacts = contacts
        self.hud.dismiss()
        self.contactTableView.reloadData()
        print("test")
     }
}

也许您使用的 API 调用正在更改执行的线程,因此您的 UI 调用未显示,因为它始终必须在主线程中执行。

于 2021-11-02T05:53:49.250 回答