MVP - 在 iOS 中解散时从 View Controller 中销毁 Presenter 对象
MVP - Destroy Presenter object from View Controller on dismiss in iOS
我正在关注 Example Here 在 swift 中应用 MVP 模式。
当我关闭我的 View Controller 时,presenter 不会被销毁,View Controller 也会保留在内存中。
当我尝试创建演示者对象时 'weak',代码在这一行中断。
presenter.login(email: "email", password: "password")
如何正确声明和销毁演示者实例。谢谢
在 Presenter
中的代码中,您创建了网络请求并在关闭时捕获了自我,而没有使用弱引用或无主引用。因此,存在一个保留周期。您可以阅读有关保留周期的更多信息 here.
更新代码:
func login(email: String, password: String)
{
self.view.showProgress()
FoodAPI.api.login(email: email, password: password) { [weak self] (msg, user) in
guard let `self` = self else {
return
}
DispatchQueue.main.async {
self.view.hideProgress()
if let user = user
{
AppDelegate.shared.user = user
UserDefaultsHelper.saveUser(user: user)
self.view.openMenu() //this line will dismiss the VC and presents next one.
}else
{
self.view.showAlert(message: msg)
}
}
}
}
如果您想查看 MVP 模式的高级用法,您可以查看我打开的项目 here 并随时问我任何问题。
我正在关注 Example Here 在 swift 中应用 MVP 模式。 当我关闭我的 View Controller 时,presenter 不会被销毁,View Controller 也会保留在内存中。
当我尝试创建演示者对象时 'weak',代码在这一行中断。
presenter.login(email: "email", password: "password")
如何正确声明和销毁演示者实例。谢谢
在 Presenter
中的代码中,您创建了网络请求并在关闭时捕获了自我,而没有使用弱引用或无主引用。因此,存在一个保留周期。您可以阅读有关保留周期的更多信息 here.
更新代码:
func login(email: String, password: String)
{
self.view.showProgress()
FoodAPI.api.login(email: email, password: password) { [weak self] (msg, user) in
guard let `self` = self else {
return
}
DispatchQueue.main.async {
self.view.hideProgress()
if let user = user
{
AppDelegate.shared.user = user
UserDefaultsHelper.saveUser(user: user)
self.view.openMenu() //this line will dismiss the VC and presents next one.
}else
{
self.view.showAlert(message: msg)
}
}
}
}
如果您想查看 MVP 模式的高级用法,您可以查看我打开的项目 here 并随时问我任何问题。