调用主线程上的方法?

首先,我正在为iPhone编写代码。 我需要能够调用主线程上的方法,而不使用performSelectorOnMainThread 。 我不想使用performSelectorOnMainThread原因是,当我试图为unit testing创​​build一个模拟时,它会导致问题。

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

问题是,我的模拟知道如何调用doSomething但它不知道如何调用performSelectorOnMainThread

那么任何解决scheme

目标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方法是一个间接的shell,只执行一个performSelectorOnMainThread来调用really_doSomething方法来做实际的东西的工作。 或者,如果您不想更改doSomething方法,请让模拟testing单元调用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) } 

它包括在我的回购标准function,检查出来: https : //github.com/goktugyil/EZSwiftExtensions