ios - 如果我使用单例网络服务发出网络请求,是否需要使用 [weak self]?
问题描述
假设我有一个使用 Alamofire 的 SessionManager 的网络单例,例如:
进口阿拉莫火
class Network {
static let shared = Network()
private init() {}
private var sessionManager: SessionManager = {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
return SessionManager(configuration: configuration)
}
func postRequest(params: [String: Any]? = nil, completion: (() -> ())? = nil) {
sessionManager.request(url, method: .post, parameters: params).validate().responseData {
// do something with response
completion()
}
}
}
然后我在服务类中使用它:
class SomeService {
static let shared = SomeService()
private init() {}
func doSomePostRequest(params: [String: Any]? = nil, completion: (() -> ())? = nil) {
Network.shared.postRequest(params: params, completion: completion)
}
}
然后我提出一个请求并使用这个服务类重新加载一个 tableview:
class MyViewController: UITableViewController {
@IBAction func fetchData(_: Any) {
SomeService.shared.doSomePostRequest {
// do i need to use [weak self] here?
self.tableView.reloadData()
}
}
}
我还需要使用 [weak self] 来避免崩溃和强引用循环吗?在任何时候,用户都可以通过按 Back 来关闭 MyViewController。
我是否正确假设我不需要它,因为服务类是单例的?如果我将它作为 MyViewController 中的一个实例,我必须使用 [weak self]?
解决方案
您使用对对象的弱引用来确保它们在应该被释放的时候被释放。
单身人士永远不会被释放。因此,您是否有一个强、弱或不安全的指针并不重要。无需使参考变弱。
推荐阅读
- javascript - 如何使用 Slate.js 将光标移动到当前行的末尾?
- javascript - 使用空返回数组重新组织数组
- server - 移动 Web 服务器后 Sage pay 错误 5003 和 http 错误 500
- mysql - MySQL数据导入/恢复
- kdb - 如何在 KDB 表列中填充空值?
- regex - 提取excel单元格中复杂分隔符之间的文本
- javascript - 在javascript中添加输入时未定义的输出
- powerbi - Power BI 将 DAX 应用于聚合后经过的时间 hh:mm:ss 的列
- python-3.x - 在网站模块中重用表单、树、看板视图
- driverless-ai - 我正在尝试在本地 Ubuntu 机器上启动 driverlessai