performSelectorOnMainThread

performSelectorOnMainThread

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

  • 这有效-立即添加了 View :
  • dispatch_async(dispatch_get_main_queue(), ^{
        //some UI methods ej
        [view addSubview: otherView];
    }
    
  • 大约需要6秒钟或更长时间才能显示:
  • [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/

    10-13 03:06