调用主线程上的方法?
首先,我正在为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