First of all I am writing code for iphone.
I need to be able to call a method on the main thread without using performSelectorOnMainThread
.
The reason that I don't want to use performSelectorOnMainThread
is that it causes problem when I am trying to create a mock for unit testing.
[self performSelectorOnMainThread:@Selector(doSomething) withObject:nil];
The problem is that my mock knows how to call doSomething
but it doesn't know how to call performSelectorOnMainThread
.
So Any solution?
Objective-C
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething];
});
Swift
dispatch_async(dispatch_get_main_queue()) {
self.doSomething()
}
Swift 3 and 4
DispatchQueue.main.async {
self.doSomething()
}
There's a saying in software that adding a layer of indirection will fix almost anything.
Have the doSomething method be an indirection shell that only does a performSelectorOnMainThread to call the really_doSomething method to do the actual Something work. Or, if you don't want to change your doSomething method, have the mock test unit call a doSomething_redirect_shell method to do something similar.
Here is a better way to do this in Swift:
runThisInMainThread { () -> Void in
// Run your code
self.doSomething()
}
func runThisInMainThread(block: dispatch_block_t) {
dispatch_async(dispatch_get_main_queue(), block)
}
Its included as a standard function in my repo, check it out: https://github.com/goktugyil/EZSwiftExtensions
And now in Swift 3:
DispatchQueue.main.async{
self.doSomething()
}
来源:https://stackoverflow.com/questions/5606145/calling-a-method-on-the-main-thread