我对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]'
doSomeTaskHere
是否需要包含在performSelectorOnMainThread:withObject:waitUntilDone:YES
中以确保runloop完成窗口的显示,从而加载“doSomeTaskHere
之前最顶层视图的任何视图'被调用?
答案 0 :(得分:0)
这些任务将在主线程的运行循环中按顺序执行。由于UI更新也发生在主线程上,因此在您从-application:didFinishLaunchingWithOptions:
返回之前,您不会允许您的应用重绘屏幕,因此[window makeKeyAndVisible];
将在[myTaskObject doSomeTaskHere];
之前完成您仍然阻止UI从更新到doSomeTaskHere
完成。
如果doSomeTaskHere
是一项昂贵的操作,您应该将其安排在运行循环的未来迭代中,或者更好地在不同的线程上进行,以便UI可以更新并响应触摸。
performSelectorOnMainThread:withObject:waitUntilDone:YES
作为最后一个参数传递,否则 NO
将不允许主线程更新UI。告诉主线程等到主线程完成其他一些工作并不是非常有用,或者与直接调用该选择器有什么不同。