避免单例的最佳方法



对于我们的iOS编程类,我们必须为Swift iOS创建一个框架。我们的想法是一个简化CoreData操作的框架。我首先创建了一个类,您将在 AppDelegate 中创建的NSManagedObjectContext放在开头,这样您就不必再编写这么长(UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext了。

open class SimpleCoreData {
var context: NSManagedObjectContext
init(context: NSManagedObjectContext) {
self.context = context
}
func delete(entity: NSManagedObject) /*-> Bool*/ {
// some code
}
func getAll(entityClass: NSManagedObject.Type) throws ->     [NSManagedObject]? {
// some code
}
func create(entityDescr: NSManagedObject.Type) -> NSManagedObject? {
// some code
}

但是我希望可以从应用程序中的任何地方访问它,如果您每次都必须实例化它,这种简化将毫无用处。

我最初考虑的是单例,但最近我了解到这不是一个好的做法。

那么,您是否知道任何解决方案可以从客户端应用程序中的任何位置访问它?或者也许在这种情况下单例可以?

牢记 Rob Napier 的出色评论,如果您决定在这种情况下避免使用单例,常见的方法是

在应用
  • 启动时,在应用委托中创建SimpleCoreData类的实例。
  • 让应用委托将此传递给初始视图控制器。该视图控制器将具有SimpleCoreData属性,但不会创建实例 - 它希望由创建它的任何代码分配一个实例,这是应用程序委托。
  • 在需要SimpleCoreData的任何地方重复此模式。也就是说,当您创建需要SimpleCoreData的对象时,请确保它具有该类型的属性,并在创建它时分配一个值。对于视图控制器,一个好地方是在prepare(for:sender:)中,如果您使用的是 segue。

但是,不必在应用委托中创建SimpleCoreData。可以在应用层次结构中需要它的第一个点创建它,然后从那里传递它。因此,如果仅在层次结构中的第二个视图控制器和从那里加载的其他对象中需要它,请在该视图控制器中创建它。

这不会使您的SimpleCoreData实例自动在任何地方可用,这意味着您正在创建一个实例,然后将其传递。通常这很好用,但正如 Rob 指出的那样,这并不总是最好的方法。它可能导致将对象传递给不需要它的对象,因为稍后创建的其他对象会传递到不需要它的对象。例如,如果您需要在初始视图控制器中SimpleCoreData,但直到层次结构的五个级别才再次出现,则仍然需要在每一步都传递它。这是shared实例有用的示例。它不是单一实例,因为允许其他实例,但它是可以根据需要使用的默认实例。

多亏了你,我终于了解到单身人士并没有那么邪恶,它们在某些情况下可以使用,包括这个,在我看来,这是一个不错的选择。也许我会将其更改为共享实例模式。
所以单例运行良好。谢谢大家的建议,我在设计模式中学到了很多东西。

相关内容

最新更新