Вызов метода в главном потоке? - PullRequest
70 голосов
/ 09 апреля 2011

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

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

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

Так есть ли решение?

Ответы [ 4 ]

229 голосов
/ 13 апреля 2011

Объектив C

dispatch_async(dispatch_get_main_queue(), ^{
  [self doSomething];
});

Swift

dispatch_async(dispatch_get_main_queue()) {
   self.doSomething()
}

Swift 3 & Swift 4

DispatchQueue.main.async{
   self.doSomething()
}
2 голосов
/ 09 апреля 2011

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

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

1 голос
/ 08 августа 2016

А теперь в Свифте 3:

DispatchQueue.main.async{
   self.doSomething()
}
1 голос
/ 06 декабря 2015

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

...