我在修改线程内的视图时遇到问题。我试图添加一个子视图,但是显示大约需要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中,我想修改成对的方法来添加子视图。[[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()
可能是更好的选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句