runloops和application:didFinishLaunch消息顺序

时间:2011-01-17 21:10:30

标签: iphone runloop

我对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];
}

这些方法中的每一个都按列出的顺序执行,或者在应用程序的主runloop完成使用'[window makeKeyAndVisible]'

的主窗口的工作之前,是否有可能发生第5步

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

1 个答案:

答案 0 :(得分:0)

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

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

除非您将performSelectorOnMainThread:withObject:waitUntilDone:YES作为最后一个参数传递,否则

NO将不允许主线程更新UI。告诉主线程等到主线程完成其他一些工作并不是非常有用,或者与直接调用该选择器有什么不同。