Вызов метода в главном потоке?



прежде всего я пишу код для iphone.
Мне нужно иметь возможность вызывать метод в основном потоке без использования performSelectorOnMainThread.
Причина, по которой я не хочу использовать performSelectorOnMainThread это вызывает проблемы, когда я пытаюсь создать макет для модульного тестирования.



[self performSelectorOnMainThread:@Selector(doSomething) withObject:nil];


проблема в том, что мой макет не знает, как назвать doSomething но он не знает, как позвонить performSelectorOnMainThread.



Итак, любое решение?

600   4  

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

а теперь в swift 3:

DispatchQueue.main.async{
   self.doSomething()
}

Comments

    Ничего не найдено.