使用自定义通知中心

问题描述 投票:0回答:1

我有一个 iOS 应用程序,由几个库和一个应用程序目标组成。 iOS 应用程序可以通过多种方式启动,例如点击文件、深层链接、通用链接、从 QuickAction 启动等。有关如何启动的信息将传递到 SceneDelegate 的场景(_:willConnectTo:options:)。现在,我想向所有提前注册观察员的图书馆广播此信息。

我正在考虑使用 NotificationCenter,但是在获取默认实例时,Apple 文档中有以下行。

如果您的应用广泛使用通知,您可能需要创建并发布到您自己的通知中心,而不是仅发布到默认通知中心。当通知发布到通知中心时,通知中心会扫描注册观察者列表,这可能会减慢您的应用程序的速度。通过围绕一个或多个通知中心功能性地组织通知,每次发布通知时都可以减少工作量,从而提高整个应用程序的性能。

因此,我没有使用默认的NotificationCenter来获取像didBecomeActiveNotification这样的生命周期事件,而是想创建一个自定义的NotificationCenter。但我找不到任何关于如何执行此操作的示例,即使在苹果文档中也是如此。其中提到了使用自定义通知中心(如上所述),但仅此而已。

我测试了以下代码。自定义通知是通过实例化NotificationCenter来创建的,如下图:

// Creating a custom notification centre
public static let notificationCenter: NotificationCenter = NotificationCenter()

注册通知时:

sQuickActionLaunchNotificationObserver = notificationCenter.addObserver(forName: Notification.Name("QUICK_ACTION_LAUNCH"), object: nil, queue: nil, using: handleNotificationBroadcasts)

func handleNotificationBroadcasts(_ broadcastNotification: Notification) {         
    // Handle the notification 
}

现在,当应用程序通过快捷方式启动时,我会广播一条通知,如下所示:

// Somewhere in the SceneDelegate's scene(_:willConnectTo:options:), when app is launched using QuickAction (shortcut)
notificationCenter.post(name: Notification.Name("QUICK_ACTION_LAUNCH"), object: nil, userInfo["QuickActionKey":shortcutItem])

我正在创建一个自定义通知中心(不使用默认值),使用它进行注册,还使用它来发布通知......所有这些都有效。

但是上面的做法正确吗?我很困惑,因为我无法在 Apple 文档中获得有关使用自定义通知中心进行广播的任何信息。有一些示例online,但在这些示例中,人们进行了子类化并添加了一些功能。但我不需要任何额外的功能...我只是创建一个新实例,因为建议创建一个自定义通知中心以避免由于观察者太多而影响性能。我只想验证这个方法。

那么,使用自定义通知中心的原因是为了避免由于添加过多的观察者而对性能产生影响。文档中提到了这一点(上面也引用了),但是多少才算太多呢?我可能会注册 20-30 个通知(非常近似),并且在使用通知对象调用的处理程序中,我正在考虑首先将代码执行移动到后台线程,返回 UI 线程并继续在后台线程......因为UI线程必须尽快返回。那么,基本上,注册多少个观察者会导致这种性能影响?

ios swift nsnotificationcenter
1个回答
0
投票

我只是创建一个新实例,因为建议创建一个自定义NotificationCenter,以避免由于观察者太多而影响性能。我只想验证这个方法。 ...我可能会注册 20-30 个通知(非常近似)

我认为“注册”指的是观察者而不是通知。这是非常非常少数的观察者。使用默认的通知中心。

在近 20 年的 Cocoa 开发中,我只有一次过度劳累 NSNotificationCenter。几年前(早在 Swift 之前)我尝试过一次,用 NSNotifications 进行 all 回调。最终,我们有大约 5000 名观察者,每秒发布几条通知。这使得滚动有点慢。

今天你永远不会以这种方式构建东西(当时这不是一个好主意)。您不需要单独的通知中心。

© www.soinside.com 2019 - 2024. All rights reserved.