swift - 单例模式初始化调用一次
问题描述
我需要使用单例模式来保存数据并将这些数据用于我的所有应用程序视图。
在我的单例模式中,我想保存来自 alamofire 调用的数据。我只想调用一次 alamofire,然后以单例模式保存这些数据。
我试图在私有 init 函数中调用 alamofire,但是当我调用单例模式的对象时,alamofire 也被调用。
请问我怎么能这样?
class AccountManager {
static let sharedInstance = AccountManager()
var data = JSON()
private init() {
Helper().alomofireGet(URL: "https://wat-stg.stardust-hosting.com/dashboard/home") { home in
self.data = home
}
}
}
解决方案
class AccountManager {
static let sharedInstance = AccountManager()
var data = JSON()
private init() {
Helper().alomofireGet(URL: "https://wat-stg.stardust-hosting.com/dashboard/home") { home in
self.data = home
}
}
}
您的代码应该可以工作,但是响应是与您的线程异步的,并且比您调用 init 的时间晚。
因此,如果您使用类似的东西:
AccountManager.sharedInstance // it will call init here
print(AccountManager.sharedInstance.data) // most probably if the init was just called a few moments ago, the data is not yet received from the server.
要进一步了解这种行为:
- 用一些印刷品标记事件
private init() {
print("called init")
Helper().alomofireGet(URL: "https://wat-stg.stardust-hosting.com/dashboard/home") { home in
print("received data")
self.data = home
}
}
- 或者只是使用一些断点
推荐阅读
- mysql - Azure 数据工厂 - 从 MySql 或 Blob 存储提取数据时出错
- rxjs - 使用 SubjectBehaviour 理解组件通信
- date - 如果当前日期不在特定日期之间,则中止操作的批处理文件
- node.js - 如何在 GitHub Pages 中托管角度配置?
- python - 没有返回 HttpResponse 对象。它返回 None 而不是
- javascript - 如何在 prod 环境中查看 vue.js 中确切的未屏蔽请求?
- javascript - 我如何使 onClick 和 href 一起工作?
- javascript - 如何过滤对象数组中的数字和字符串
- google-cloud-dataflow - Cloud Dataflow 和 Dataprep 之间有什么区别
- matlab - Matlab optimproblem:可以使用第 3 方 ILP 求解器吗?