Вызов метода в главном потоке?
прежде всего я пишу код для iphone.
Мне нужно иметь возможность вызывать метод в основном потоке без использования performSelectorOnMainThread.
Причина, по которой я не хочу использовать performSelectorOnMainThread это вызывает проблемы, когда я пытаюсь создать макет для модульного тестирования.
[self performSelectorOnMainThread:@Selector(doSomething) withObject:nil];
проблема в том, что мой макет не знает, как назвать doSomething но он не знает, как позвонить performSelectorOnMainThread.
Итак, любое решение?
4 ответов:
С
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 должен быть оболочкой косвенного действия,которая выполняет только performSelectorOnMainThread для вызова метода really_doSomething для выполнения фактической работы. Или, если вы не хотите изменять свой метод doSomething, попросите модуль mock test вызвать метод doSomething_redirect_shell, чтобы сделать что-то подобное.
вот лучший способ сделать это в 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
Comments