performSelectorOnMainThread:和主队列上的dispatch_async()有什么区别?

米格尔·洛梅利(MiguelLomelí)

我在修改线程内的视图时遇到问题。我试图添加一个子视图,但是显示大约需要6秒钟或更长时间。我终于让它工作了,但我不知道它到底是怎么做到的。所以我想知道为什么它起作用,以及以下方法之间的区别是什么:

  1. 这有效-立即添加了视图:
dispatch_async(dispatch_get_main_queue(), ^{
    //some UI methods ej
    [view addSubview: otherView];
}
  1. 需要大约6秒钟或更长时间才能显示:
[viewController performSelectorOnMainThread:@selector(methodThatAddsSubview:) withObject:otherView
    waitUntilDone:NO];
  1. 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

没有在模态运行循环中执行主队列上的dispatch_async块

GCD主队列和主线程有什么区别?

串行队列上的dispatch_async和dispatch_sync之间的区别?

GCD中的Dispatch_barrier_async和串行队列,它们之间有什么区别?

直接执行方法与在dispatch_async(dispatch_get_main_queue(),^ {})块中有什么区别

DISPATCH_QUEUE_CONCURRENT和全局并发调度队列之间有什么区别

“事件循环队列”和“作业队列”有什么区别?

在全局队列上用dispatch_async运行的块是否有可能在主线程上执行?

主线程在viewDidLoad中的并发队列上或方法内执行dispatch_async很重要

使用mapDispatchToProps和this.props.dispatch()有什么区别

Vue.js $ emit和$ dispatch有什么区别?

dispatch和bindActionCreators之间有什么区别?

消息队列和ESB有什么区别?

async {... AsyncAdd ...}和async {... AsyncAdd ...}有什么区别?

dart中的async和async *有什么区别?

Dart中的async和async *有什么区别?

为什么私有队列在主队列更新UI之后调度_async更新UI?

JavaScript promise和async await有什么区别?

FakeAsync和quiver.testing.async有什么区别?

Future / Await和Async / Await有什么区别

packaged_task和async有什么区别

document.ready和async有什么区别?

Promise、await/async 和 setTimeout 有什么区别?

DISPATCH_QUEUE_CONCURRENT和DISPATCH_QUEUE_SERIAL有什么区别

在Redux中-使用store.dispatch()和dispatch()有什么区别吗?

dispatch_get_global_queue和dispatch_queue_create有什么区别?

为什么不能在dispatch_async串行队列中停止计时器?

“ as?”,“ as!”和“ as”有什么区别?

$ _和!$有什么区别?