微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

演示者在 VIPER 项目中给出零错误

如何解决演示者在 VIPER 项目中给出零错误

在我用 Viper 制作的项目中,ViewController 中的 Presenter 给出了一个 nil 错误。这是什么原因?我该如何解决这个问题?

应用委托

let wireframe = MovieWireframe()
let movies = wireframe.createMovieController()
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = UINavigationController(rootViewController: movies)
window?.makeKeyAndVisible()

视图控制器

这里的演示者给出了一个错误

var presenter: IMoviePresenter? //Nil
   
override func viewDidLoad() {
  super.viewDidLoad()

  presenter?.startFetchingMovies() //Nil 
}

主持人

此处的 StartFetchingMovies 不起作用,因为演示者为零。

class MoviePresenter: IMoviePresenter {
    
    var view: IMovieView?
    var interactor: IMovieInteractor
    var router: IMovieWireframe
    var movies: MoviesResult?
    
    init(view: IMovieView?,interactor: IMovieInteractor,router: IMovieWireframe) {
        self.view = view
        self.interactor = interactor
        self.router = router

    }
    

    func startFetchingMovies() {
        interactor.fetchMovies()

    }
    
    func showMovieController(navigationController: UINavigationController) {
        router.pushToMovieDetailScreen(navigationController: navigationController)
    }
}

extension MoviePresenter: IMovieInteractorDelegate {
    func movieInteractorDidSuccesstoFetchMovies(movies: MoviesResult) {
        self.movies = movies
        view?.showMovie(movies: movies)
    }
    
    func movieInteractorDidFailToFetchMovies() {
        print("error")
    }
}

路由器

这里的View.presenter不是nil。

class MovieWireframe: IMovieWireframe {
    
    func createMovieController() -> UIViewController {
        print("createMovieController")
        let view = MovieVC()
        let movieService = apiclient()
        let interactor = MovieInteractor(movieService: movieService)
        let presenter = MoviePresenter(
            view: view,interactor: interactor,router: self
        )
        
        view.presenter = presenter
        print("presenter: \(presenter)")
        interactor.delegate = presenter

        return view
    }
    
    func pushToMovieDetailScreen(navigationController: UINavigationController) {
        
        
    }
}

解决方法

ViewController 的初始化在 createMovieController 在这里的第一行和第二行之间被调用之前完成:

let wireframe = MovieWireframe()
let movies = wireframe.createMovieController()

在那段短暂的时间里,视图加载(由于创建线框)

var presenter: IMoviePresenter?

作为 nil(因此为什么暂时需要问号)并导致 viewDidLoad 被“过早地”调用(即在调用第二行之前)。因此,消除 2 部分构造,使其不会在 1) 没有 MovieController 的情况下零碎地完成,然后 2) 作为 MovieWireframe 构造之外的第二步完成。 1 部分结构不是 2 部分。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。