Использование 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
?
Ответы
Ответ 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)
}