1

我对 Runloops 的理解是基本的,所以这似乎是一个非常陈词滥调的问题。

我的application:didFinishLaunchingWithOptions(或applicationDidFinishLaunching)中有以下内容:

{
// 1. typical app setup work: create various views, create a tab bar, add 
// navigation controller and views to the tab bar 

// 2. perform some other app initialization tasks

// 3. Add main view to the window
[window addSubview:tabbarController.view];

// 4. Make window visible
[window makeKeyAndVisible];

// 5. Perform one final behind the scene task
[myTaskObject doSomeTaskHere];
}

这些方法中的每一个是否都按列出的顺序执行,或者是否有可能在应用程序的主运行循环完成放置主窗口的工作之前发生第 5 步'[window makeKeyAndVisible]'

是否doSomeTaskHere需要包装成 aperformSelectorOnMainThread:withObject:waitUntilDone:YES以确保 runloop 完成窗口的显示,从而在doSomeTaskHere调用 ' ' 之前加载最顶层视图的任何视图?

4

1 回答 1

0

这些任务将在主线程的运行循环中按顺序执行。由于 UI 更新也发生在主线程上,因此在您返回之前不允许您的应用重绘屏幕,-application:didFinishLaunchingWithOptions:因此 while[window makeKeyAndVisible];将在[myTaskObject doSomeTaskHere];您仍然阻止 UI 更新之前完成,直到doSomeTaskHere完成为止。

如果doSomeTaskHere这是一项昂贵的操作,您应该将其安排在运行循环的未来迭代中,或者更好地在不同的线程上执行该工作,以便 UI 可以更新并响应触摸。

performSelectorOnMainThread:withObject:waitUntilDone:YESNO除非您作为最后一个参数传递,否则不允许主线程更新 UI 。告诉主线程等到主线程完成一些其他工作并不是很有用,或者与直接调用该选择器有什么不同。

于 2011-01-17T21:19:37.393 回答