每个应用程序通过扩展创建单例实例?

时间:2016-02-24 01:13:39

标签: ios swift swift2 ios9

Apple documentation中,它表示某些实例需要为每个应用创建一次,例如HKHealthStore:

  

每个应用只需要一个HealthKit商店。这些是长寿命的物体。创建商店一次,并保留一个参考供以后使用。

正在做一些方便的事情,比如下面安全还是有更好的方法?

public extension HKHealthStore {

    class var sharedInstance: HKHealthStore? {
        if !HKHealthStore.isHealthDataAvailable() {
            return nil
        }

        struct Singleton {
            static let instance = HKHealthStore()
        }

        return Singleton.instance
    }

}

这样我可以在不污染自定义管理器的情况下执行此操作: HKHealthStore.shareInstance?.requestAuthorizationToShareTypes

这样可以,还是有更好的架构方法?

2 个答案:

答案 0 :(得分:1)

我会这样做:

class MyHealthStore:HKHealthStore {
    static let sharedInstance = MyHealthStore()
}

现在您可以使用MyHealthStore.sharedInstance,它将始终返回同一商店。

您也可以在没有任何子类化的情况下实现相同的目标:

class MyCustomClass:NSObject {
    static let sharedInstance = MyCustomClass()
    let healthStore = HKHealthStore()
}

现在您可以使用MyCustomClass.sharedInstance.healthStore

答案 1 :(得分:0)

在应用中拥有一个单例HKHealthStore实例而不对其进行子类化(Apple不鼓励)或创建一个虚拟类的更干净,更快捷的方法是通过简单的扩展:

extension HKHealthStore {
    static let shared = HKHealthStore()
}

这样您就可以简单地实现..

HKHealthStore.shared.requestAuthorization(...)
HKHealthStore.shared.execute(query)

就是这样。