Подтвердить что ты не робот

Использование dispatch_async с самим собой

Я несколько раз сталкивался с этой проблемой при переносе кода Objective-C в Swift. Скажем, у меня есть следующий код:

dispatch_async(dispatch_get_main_queue()) {
    self.hostViewController?.view.addSubview(self.commandField)
}

Это приведет к ошибке, подчеркивающей весь вызов dispatch_async, предлагая:

Could not find member 'addSubview'

Я предполагаю, что это ошибка, которая еще не была должным образом реализована, потому что, если я поместил вызов addSubview вне блока dispatch_async, проект будет строптивым. Первоначально я предполагал, что это может иметь какое-то отношение к захвату self в блоке. Однако вставка [unowned self] in приводит к той же ошибке, что и [weak self] in (после того, как были вставлены соответствующие операторы разворота !).

Как я могу получить dispatch_async блоки для работы в Swift, которые нужно захватить self?

4b9b3361

Ответ 1

Вы должны условиться отменить это действие на не-nullity, а не тестировать его после того, как вы его уже инициировали:

if let hostView = self.hostViewController?.view {
    DispatchQueue.main.async {
         hostView.addSubview(self.commandField)
    }
} else {
    // handle nil hostView 
}

Вы никогда не должны разворачивать опцию вне if let или сначала тестировать ее. Выполнение этого также должно решить вашу проблему со слабым ядром.

Ответ 2

Синтаксис dispatch_async изменился с помощью Swift 3:

DispatchQueue.main.async { 
    hostView.addSubview(self.commandField)
}