避免单身人士的最佳方法

时间:2018-01-29 13:32:36

标签: ios swift core-data frameworks

对于我们的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
    }

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

我第一次考虑单身人士,但我最近才知道这不是一个好习惯。

那么你知道任何解决方案可以从客户端应用程序的任何地方访问它吗?或者在这种情况下,单身人士可以吗?

2 个答案:

答案 0 :(得分:1)

记住Rob Napier的优秀评论,如果你决定在这种情况下避免使用单身人士,那么常见的方法就是

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

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

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

答案 1 :(得分:0)

我终于得知你,单身人士不是那么邪恶,他们可以在某些情况下使用,包括这个,在我看来,这似乎是一个不错的选择。也许我会为共享实例模式更改它 因此单身人士运作良好。谢谢大家的建议,我在设计模式方面学到了很多东西。