2011-04-09 158 views
52

首先,我正在为iphone编写代码。 我需要能够在主线程上调用方法而不使用performSelectorOnMainThread。 我不想使用performSelectorOnMainThread的原因是,当我尝试为单元测试创​​建模拟时,它会导致问题。在主线程上调用方法?

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

的问题是,我的模拟知道如何调用doSomething但它不知道该怎么称呼performSelectorOnMainThread

那么任何解决方案?

回答

181

目标C

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

斯威夫特

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

斯威夫特3 &斯威夫特4

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

你只是做我一天的SWIFT代码3。谢谢! – 2016-11-11 00:33:19

2

在软件中有一种说法,即增加一层间接寻址可以解决几乎所有问题。

doSomething方法是一个间接shell,它只执行一个performSelectorOnMainThread来调用really_doSomething方法来执行实际的某些工作。或者,如果您不想更改doSomething方法,请让模拟测试单元调用doSomething_redirect_shell方法来执行类似的操作。

0

这里是一个更好的方式在斯威夫特做到这一点:

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

+0

这在任何情况下都不会更好,您创建了一个除调用另一个外什么也不做的函数。顺便说一句,迅捷的语法可以进一步简化“() - >无效”不需要 – aryaxt 2015-12-06 04:51:32

+0

它更人性可读/可写。是的自动完成添加“() - >无效在”。有无论如何禁用这种自动完成行为在void> void closures? – Esqarrouth 2015-12-06 05:00:49

+0

您拥有的方法名称可能会引起误解,听起来像块会立即在主线程上执行,但事实并非如此。主队列上的dispatch_async将代码块添加到下一个runloop,这个重要的行为隐藏在名为“runThisInMainThread – aryaxt 2015-12-06 05:03:28

1

现在在SWIFT 3:

DispatchQueue.main.async{ 
    self.doSomething() 
} 
相关问题