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

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

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

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

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

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

4b9b3361

Ответ 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()
}

Ответ 2

Там высказывание в программном обеспечении, что добавление слоя косвенности будет исправить почти все.

Использовать метод doSomething как оболочку, которая выполняет только функцию executeSelectorOnMainThread, чтобы вызвать метод real_doSomething для выполнения фактической работы Something. Или, если вы не хотите изменять свой метод doSomething, попросите модуль ложных тестов вызвать метод doSomething_redirect_shell, чтобы сделать что-то подобное.

Ответ 3

И теперь в быстрой 3:

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

Ответ 4

Вот лучший способ сделать это в 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