Стремительный доступ к вар в закрытии - PullRequest
0 голосов
/ 10 января 2019

У меня есть такой код Swift:

  private var myVar = 0 {
    didSet {
        DispatchQueue.main.async { [weak self] in

            if let myVar = self?.myVar {
                if myVar > 0 {
                   // Do some UI stuff, access myVar again
                }        
            }
        }
    }
}

Мой вопрос заключается в том, нужно ли нам всегда проходить через боль «если позволить myVar = self? .MyVar», а затем проверять myVar, особенно здесь, где мы находимся в блоке didSet той же переменной?

1 Ответ

0 голосов
/ 10 января 2019

DispatchQueue.main.async гарантированно выполнит предоставленное закрытие и не будет хранить ссылку на пройденное закрытие, поэтому не вызовет утечку памяти, даже если вы не отметите self как слабое. Итак, следующее должно быть достаточно безопасным:

private var myVar = 0 {
  didSet {
    DispatchQueue.main.async {
      if self.myVar > 0 {

      }        
    }
  }
}

Обратите внимание, что даже если ваша ссылка на объект станет равной нулю, ссылка на self будет существовать до тех пор, пока не будет закрыто закрытие async. Таким образом, self будет жить до тех пор, пока блок async не будет выполнен и не будет обработан DispatchQueue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...