Использование [слабого себя] для 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

Другие вопросы по тегам