Использование [слабого себя] для HTTP-запроса
У меня есть вопрос относительно необходимости использования [слабого я] в замыканиях и HTTP-запросах.
В качестве примера у нас есть HTTP-запрос, который вызывает закрытие при завершении:
func saveBla() {
blaManager.saveBla(bla) { error in
self.pay5euro()
}
}
Мои вопросы: мне нужно использовать слабую ссылку здесь или нет? Прежде всего, я не хочу потерять ответ от вызова API после перехода на другую страницу. Кроме того, я не хочу создавать цикл сохранения с утечкой памяти?
func saveBla() {
blaManager.saveBla(bla) { [weak self] error in
guard let strongSelf = self else { return }
strongSelf.pay5euro()
}
}
Действительно ли необходимо использовать слабость в этой ситуации?
1 ответ
Это зависит от отношений вашего менеджера и вашего контролера.
Вывод: Это приведет к сохранению цикла, если A принадлежит B, а B принадлежит A без слабой ссылки.
class NetManager {
func fire(completion: (_ result: Bool) -> Void) {
completion(true)
}
}
class controler: UIViewController {
override func viewDidLoad() {
let manager = NetManager()
// In this case the Manager and Controller NOT own each other,
// And the block will release after request finished, it is ok to not use weak.
manager.fire { (result) in
}
}
let manager = NetManager()
func anOtherExample() {
// In this case the controller own the manager,
// manager own the controller, but manager will relase the controller after
// request finished, this will cause a delay to controller's relase, but it is still ok.
manager.fire { (result) in
}
}
}
если ваши менеджеры ведут себя так, то диспетчер будет владеть контроллером, и это вызовет сохранение цикла, когда диспетчер владеет диспетчером.
class NetManager {
var completion: ((_ result: Bool) -> Void)?
func fire(completion: @escaping (_ result: Bool) -> Void) {
self.completion = completion
}
}
более подробная информация: https://krakendev.io/blog/weak-and-unowned-references-in-swift