Swift中的Singleton模式

Singleton可以说是编程世界中使用最广泛的设计模式。 有些人说不使用它们,而有些人则有不同的看法,但我们都知道它们在编程时有多方便。

好吧,这篇文章不是关于Singleton的优缺点,也不是我们是否应该使用它们? 关于如何在iOS(Swift)中正确使用它们,尤其是在多线程环境中。 因此,让我们开始吧–

单例模式可确保在应用程序的整个生命周期中仅实例化一个类的实例。 有时您要确保仅实例化一个类的实例,并且您的应用程序仅使用该实例。 那是单例模式的主要目标。

例如,我们经常在iOS中使用Singleton –

  1. UserDefaults //最广泛用于持久性
  2. UserNotifications //用于远程通知(现在或之后使用)
  3. UIApplication //主应用程序类
  4. SKPaymentQueue //应用内购买付款队列(StoreKit)
  5. URLSession //用于网络通话
  6. NSNotificationCentre //用于广播
  7. FileManager //用于文件I / O操作

这些都是我们在编程时很容易使用的iOS中的Singleton示例。 让我们看看如何在iOS(Swift)中创建自己的Singleton

这就是我们快速创建Singleton模式的方式,过去我们不得不将实例化代码放置在dispatch_once块下才能执行一次的日子已经过去了,这样我们可以保证对象实例化只发生一次,静态常数,我们无需做任何特殊的事情就可以实现。 苹果保证所有静态常量仅实例化一次,并且它们隐式使用dispatch_once,证明在这里–

现在,如果您仔细观察,就会发现我们的代码中还有另外一件事,是的,我们正在谈论私有初始化程序。 为什么在那儿? 将初始化器设为私有需要什么? 因此,您的问题的答案是–

如果别人这样做

让anotherInstance = Singleton();

//但是,我们说过只能有一个此类的实例,但是我们不能阻止它们像上面那样创建另一个实例,因此这就是为什么我们将初始化程序设为私有的原因。

现在,如果我们尝试创建另一个对象,则编译器将给我们错误–

到目前为止,上面的代码没有问题,它可以完美运行,我们创建了Singleton,并且我们将初始化程序设为私有,以避免创建更多对象,但这是Singleton对象的唯一实例。当我们的应用程序会话未使用Singleton对象但它存在于内存中时,就会出现这种情况。 因此,要解决此问题-我们可以延迟实例化该实例吗? 在多线程环境中会不会有问题? 如果是,那么如何解决呢? 让我们来看看 –

因此,请考虑以下情形:线程A试图实例化一个对象,而在实例化另一个线程B之前也请求该对象,因此为了避免这种情况(很容易在多线程环境中出现),我们提出了一个障碍,不允许稍后的线程(s)进入初始化部分,因此只有一个实例被初始化。

继续阅读,继续分享🙂