swift - MVP - 在 iOS 中关闭时从 View Controller 中销毁 Presenter 对象
问题描述
我在这里关注示例快速应用 MVP 模式。当我关闭我的视图控制器时,演示者没有被破坏,视图控制器也保留在内存中。
当我尝试使演示者对象“弱”时,代码在这一行中断。
presenter.login(email: "email", password: "password")
如何正确声明和销毁演示者实例。谢谢
解决方案
在您的代码中,Presenter
您创建对网络的请求并在不使用弱引用或无主引用的情况下捕获自我。因此,存在一个保留周期。您可以在此处阅读有关保留周期的更多信息。
更新代码:
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模式的高级用法,你可以在这里查看我的开放项目,并随时问我任何问题。
推荐阅读
- json - 如何在 laravel 控制器中获取 json 对象
- javascript - 使用 each 和 handlebars 助手对对象键进行排序
- python-3.x - “在尝试使用来自 'HTTPS' url 的'requests' 'get' 内容时获取 SSLError”
- django - 在 EKS 上运行的 Django API 的极端延迟
- python - 我究竟做错了什么?半径 = 半径 + 25
- heroku - 如何将heroku dynos的“进入睡眠”时间设置为30分钟以外的值?
- scala - 如何以kafka为源处理结构化流中的每个值?
- scala - 将映射数据转换为 DataFrame 时出现 NullPointerException
- vala - 如何在 Vala 中使用 C 库?或者如何使用 g-ir-scanner?
- python - 保存的 Gensim LdaMallet 模型在不同的控制台中不起作用