Передача себя и возвращение в закрытие без сохранения цикла - PullRequest
0 голосов
/ 30 мая 2019

Я устал от использования захвата [weak self] в замыканиях, поэтому я хотел бы передать self и вернуть его в замыкании следующим образом:

alertManager.askToConfirm(from: self) { vc, confirmed in
        if confirmed {
            vc.model.confirm()
        } else {
            vc.model.reject()
        }
    }

внутри AlertManager мой код будеткак это:

func askToConfirm<T>(from vc: T, completion: @escaping (T) -> ()) {
    let invitation = pageItemFactory.createConfirmationPageItem() { [weak self] accepted in
        self?.dismissAlert()
        completion(vc, accepted)
    }
    present(invitation)
}

Будет ли это создавать цикл сохранения?

1 Ответ

0 голосов
/ 30 мая 2019

Нет, насколько я вижу, это не приведет к циклу сохранения.


Например, это приведет к циклу сохранения.Когда выполняется myFunction, экземпляр Foo будет содержать сильную ссылку на блок completion.В свою очередь, блок completion содержит строгую ссылку на экземпляр Foo.Это будет цикл сохранения, и в этом случае вам нужно добавить список захвата.

class Foo<T> {
  var completion: (T) -> ()

  func myFunction(_ vc: T, completion: @escaping (T) -> ()) {
    self.completion = completion // This will create a retain cycle
    completion(vc)
  }

  func doSomething() { 
    myFunction(self) { vc in
      print(vc)
    }
  }
}
...