如果performSelectorOnMainThread:waitUntilDone:从主线程调用,它什么时候执行?

Jum*_*hyn 9 multithreading objective-c

我正在编写一个使用NSURLConnection来使用异步Web请求的应用程序,因此我运行了多个线程.为了确保我的应用程序的主要逻辑发生在一个线程上,我正在大量使用performSelectorOnMainThread:waitUntilDone:.有时虽然,我在主线程上运行它,这激起了我的好奇心.

如果performSelectorOnMainThread:waitUntilDone:在主线程中调用?它的行为和它一样performSelector:吗?如果waitUntilDone:是的话YES?怎么样NO?

编辑:我发现,当waitUntilDone:是YES时,执行选择(几乎)立即,但我不能当如果执行弄清楚waitUntilDone:是NO.

saa*_*nib 13

performSelectorOnMainThread:withObject:waitUntilDone:
Run Code Online (Sandbox Code Playgroud)

是在传递信息的方法main thread你的application.这里的booleanvalue in参数waitUntilDone:指定是否要阻止main thread执行指定selector或不执行.

例如 -

如果你写这两行 -

[self performSelectorOnMainThread:@selector(print) withObject:nil waitUntilDone:YES];

NSLog(@"Hello iPhone");
Run Code Online (Sandbox Code Playgroud)

这是打印方法 -

- (void) print
{
    NSLog(@"Hello World");
}
Run Code Online (Sandbox Code Playgroud)

然后你会得到这个o/p

Hello World
Hello iPhone
Run Code Online (Sandbox Code Playgroud)

所以它首先暂停你的执行main thread并打印"Hello World",然后再次执行主线程并打印"Hello iPhone"因为你指定YES了waitUntilDone:

但如果你NO在waitUntilDone:那里指定它将打印像这样 -

Hello iPhone
Hello World
Run Code Online (Sandbox Code Playgroud)

它清楚地表明它将您执行指定的请求selector放在一个queue操作系统中并获得它的main thread自由执行请求.

调用performSelectorOnMainThread:withObject:waitUntilDone:无论是从main thread或secondary thread不作任何区别在它的执行,这取决于你在指定的内容上waitUntilDone:

了解更多信息 -

NSObject类参考

  • 我当然是吹毛求疵,但你错在“如果你指定‘NO’,那么它会打印‘Hello iPhone\nHelloWorld’”。事实上,鉴于调用站点不在主线程上执行,两个输出的顺序是*不可*确定的。否则,如果调用站点在主线程上执行,主线程将不会被阻塞 - 相反,如果 _waitUntilDone_ 是 `YES`,则选择器将立即执行。;) 你的最后一句话太含糊了。 (2认同)