为什么applicationDidFinishLaunching在AppKit中主视图的draw方法之后被调用

Why is applicationDidFinishLaunching called after main view's draw method in AppKit

我习惯于在 iOS 中的 applicationDidFinishLaunching 中执行应用程序初始化,但在 appKit 中它被调用 主视图的 draw 方法!由于应用程序尚未初始化,现在绘制任何内容还为时过早。这是顺序:

  1. viewDidLoad(主视图控制器)
  2. draw(_ dirtyRect:)(主控制器视图)
  3. applicationDidFinishLaunching(来不及了!)

API reference says以下约applicationDidFinishLaunching

This method is called after the application’s main run loop has been started but before it has processed any events.

因此应在 applicationDidFinishLaunching 之后发布抽奖活动。 我不习惯这种行为 -- 这是怎么回事?

你只是在做一个错误的假设。在调用 applicationDidFinishLaunching 之前,初始视图控制器的 viewDidLoad 确实 触发。那是因为运行时加载故事板的初始 window 控制器,并导致加载其视图,然后在应用程序委托上调用 applicationDidFinishLaunching

如果您需要在主视图 draw 之前发生事件,请实施 applicationWillFinishLaunching。但它会更好,因为您现在知道事件的实际顺序,在主视图控制器的 viewDidLoad 中进行应用程序初始化,因为它甚至更早。毕竟,如果您最初绘制的内容取决于您之前执行的初始化,那么 viewDidLoad 似乎非常适合。

您可以在基于现代故事板的传统现代启动中获得的最早 事件是应用程序委托的 awakeFromNib。但要小心,因为在 macOS 中它的调用频率可能比你预期的要高。 (实际上,class 方法 initialize 甚至更早,但请注意,您不能在 Swift 中实现它。)