Ответ 1
Цель C
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething];
});
Свифта
dispatch_async(dispatch_get_main_queue()) {
self.doSomething()
}
Swift 3 и Swift 4
DispatchQueue.main.async{
self.doSomething()
}
Прежде всего, я пишу код для iphone.
Мне нужно иметь возможность вызвать метод в основном потоке без использования performSelectorOnMainThread
.
Причина, по которой я не хочу использовать performSelectorOnMainThread
, заключается в том, что она вызывает проблемы, когда я пытаюсь создать макет для модульного тестирования.
[self performSelectorOnMainThread:@Selector(doSomething) withObject:nil];
Проблема в том, что мой макет знает, как вызвать doSomething
, но он не знает, как вызвать performSelectorOnMainThread
.
Итак, любое решение?
Цель C
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething];
});
Свифта
dispatch_async(dispatch_get_main_queue()) {
self.doSomething()
}
Swift 3 и Swift 4
DispatchQueue.main.async{
self.doSomething()
}
Там высказывание в программном обеспечении, что добавление слоя косвенности будет исправить почти все.
Использовать метод doSomething как оболочку, которая выполняет только функцию executeSelectorOnMainThread, чтобы вызвать метод real_doSomething для выполнения фактической работы Something. Или, если вы не хотите изменять свой метод doSomething, попросите модуль ложных тестов вызвать метод doSomething_redirect_shell, чтобы сделать что-то подобное.
И теперь в быстрой 3:
DispatchQueue.main.async{
self.doSomething()
}
Вот лучший способ сделать это в Swift:
runThisInMainThread { () -> Void in
// Run your code
self.doSomething()
}
func runThisInMainThread(block: dispatch_block_t) {
dispatch_async(dispatch_get_main_queue(), block)
}
Он включен как стандартная функция в моем репо, проверьте его: https://github.com/goktugyil/EZSwiftExtensions