我在修改线程内的 View 时遇到问题。我试图添加一个 subview ,但是显示大约需要6秒钟或更长时间。我终于让它工作了,但我不知道它到底是怎么做到的。所以我想知道为什么它起作用,以及以下方法之间的区别是什么:
dispatch_async(dispatch_get_main_queue(), ^{
//some UI methods ej
[view addSubview: otherView];
}
[viewController performSelectorOnMainThread:@selector(methodThatAddsSubview:) withObject:otherView
waitUntilDone:NO];
NSNotification
方法-还花了大约6秒钟来显示观察者,它是在viewController中,我想将其修改为与添加 subview 的方法配对。 [[NSNotificationCenter defaultCenter] postNotificationName:
@"notification-identifier" object:object];
作为引用,在类CompletionHandler
的此ACAccountStore
内部调用了这些方法。accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {
if(granted) {
// my methods were here
}
}
最佳答案
默认情况下,-performSelectorOnMainThread:withObject:waitUntilDone:
仅调度选择器以默认运行循环模式运行。如果运行循环处于另一种模式(例如跟踪模式),则在运行循环切换回默认模式之前它不会运行。您可以使用-performSelectorOnMainThread:withObject:waitUntilDone:modes:
变体来解决此问题(通过传递您希望它在其中运行的所有模式)。
另一方面,一旦主运行循环将控制流返回到事件循环,dispatch_async(dispatch_get_main_queue(), ^{ ... })
将运行该块。它不在乎模式。因此,如果您也不想关心任何模式,dispatch_async()
可能是更好的选择。
关于objective-c - performSelectorOnMainThread : and dispatch_async() on main queue?有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9335434/