【问题标题】:Can I pass parameters to a Singleton class in Swift? And general Singleton use我可以将参数传递给 Swift 中的 Singleton 类吗?和一般的 Singleton 使用
【发布时间】:2017-02-10 00:07:50
【问题描述】:

是否可以将参数传递给 Singleton 类?如果有怎么办?

这是我的一个 Singleton 类的 sn-p:

class NotificationManager: NSObject {

static let sharedManager = NotificationManager()
var tabBarController: UITabBarController!

private override init() {
    super.init()
}

在此 Singleton 的情况下,公共属性 tabBarController 在使用之前必须始终设置。

我想知道是否可以在启动时传递正确的UITabBarcontroller 对象,因为我认为这是我的 Singleton 类被实例化的时候?这将防止类被错误地实现。并不是说我曾经期望这会成为一个问题。

另外,在这种情况下使用 Singleton 类是否完全没问题?管理一组特定的操作?过去我总是传递对象,尤其是managedObjectContext,但现在我发现 Singleton 类可以让大型应用程序中的一切变得更清洁、更好、更安全(因为只有一种立场)。我可以理解在类之间传递对象对于较小的应用程序来说很好,但是一旦它们变大就会变得非常混乱。

在我最近的应用程序中,我还在我的 iOS 和 watchOS 应用程序之间使用了一个共享的 Singleton 类,它定义了一些全局变量,例如服务器端点和环境。这似乎是定义需要此访问权限的变量的最佳方式。

我有朋友告诉我 Singletons 不好用,而且根据我的谷歌搜索,它看起来真的是一个混合包。就我而言,它们使我的代码更易于管理和处理。

谢谢。

【问题讨论】:

    标签: swift singleton


    【解决方案1】:

    您可以随意设置单例。您只需要更改它的初始化/组织方式。 this question 中有一些例子。对于该模式的一些一般批评,您可以read here

    我自己的观点是,避免单例通常是好的,但有时它们是必要的。但是我倾向于说单例应该只在应用程序启动时可以被初始化(应用程序委托)时使用,并且可以/应该在整个应用程序的整个生命周期中使用和存活。

    我会警告不要使用与您的用户界面有关的单例。看来您正在捕获一个 UITabBarController。我强烈建议不要这样做,而是使用委托或Notifications 来响应事件。这部分是因为一般的设计怪异,但它也使应用程序恢复和应用程序的内存占用变得复杂。

    【讨论】:

    • 很高兴知道。至于UITabBarController,在这个类中,我只是在更新一个标签的徽章图标。如果我要为此使用Notifications,我需要在每个调用相关更新函数的类中都有一个通知处理程序。这会让一切变得有点混乱。如果我要使用委托,那意味着我需要在使用相关函数的每个类中都有委托协议函数。我认为在这种情况下,代表会看起来更好。想法?
    • 我会说这是通知的完美用途 :) 我建议您使用可以调用的静态方法或函数,因此您只需在应用程序的任何位置执行 NotificationHandler.sendNotificationsUpdateNotification() 并拥有你的标签控制器会听那个。
    猜你喜欢
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多