ios - 避免单例的最佳方法

标签 ios swift core-data frameworks

对于我们的 iOS 编程类(class),我们必须为 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 的精彩评论,如果您决定在这种情况下避免使用单例,常见的方法是

  • 当应用启动时,在应用委托(delegate)中创建您的 SimpleCoreData 类的实例。
  • 让应用委托(delegate)将其传递给您的初始 View Controller 。该 View Controller 将有一个 SimpleCoreData 属性,但不会创建实例——它会期望一个由创建它的任何代码分配,这里是应用程序委托(delegate)。
  • 在任何需要 SimpleCoreData 的地方重复此模式。也就是说,当您创建一个需要 SimpleCoreData 的对象时,请确保它具有该类型的属性,并在您创建它时为其分配一个值。对于 View Controller ,如果您正在使用 segues,那么在 prepare(for:sender:) 中执行此操作的好地方。

虽然没有必要在应用程序委托(delegate)中创建 SimpleCoreData。您可以在应用程序层次结构中需要它的第一个点创建它,然后从那里传递它。因此,如果仅在层次结构中的第二个 View Controller 和从那里加载的其他对象中需要它,请在该 View Controller 中创建它。

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

关于ios - 避免单例的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48502498/

相关文章:

objective-c - 核心数据中关系的属性

javascript - 什么时候使用 WL.App.sendActionToNative?

ios - 使自动播放在 IPAD 和 IPHONE 上工作

ios - Swift 中的持久化 UIToolbar

ios - 使用获取的结果 Controller 对删除的行进行动画处理

ios - 如何在核心数据中计算一周中每一天的总和

ios - clang : error: linker command failed with exit code 1 (use -v to see invocation) when setting up cocoapods environment

iphone - MKMapView 中可能存在的错误

swift - 将 CGFloat 数组标准化为 UIView 框架高度

swift - 使用 Swift 按下 UIButton 后如何在 iOS 上关闭键盘