【问题标题】:runloops and application:didFinishLaunch message orderrunloops 和 application:didFinishLaunch 消息顺序
【发布时间】:2011-01-17 21:10:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: iphone runloop


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2023-03-26
      • 2017-04-09
      • 1970-01-01
      • 2015-11-09
      相关资源
      最近更新 更多