对于我的iOS应用中的用户模型,我使用单例。我想用保存用户对象NSCoding
。
保存它没问题,但是如何将解码后的用户分配给我的单例的共享实例?
还有一个问题,对用户对象使用单例是个好主意吗?
您需要做的是一种非传统的方法来实现单例模式。通常,您很快就会这样做:
class MySingleton {
static let sharedInstance = MySingleton()
init() {
println("BBB")
}
}
您不能以这种方式使用它,因为所有的设置工作都推迟到了初始化程序,而您却想在实际创建实例之前进行一些调整。做您需要的并保持线程安全的最简单方法是从Apple的C库的深处使用dispatch_once:
class MySingleton : NSObject {
class var sharedInstance: MySingleton {
struct Statics {
static var instance: MySingleton? = nil
static var dispatchOnceToken: dispatch_once_t = 0
}
dispatch_once(&Statics.dispatchOnceToken) {
if let data: NSData = .... (get your data here) {
let decodedInstance = NSKeyedUnarchiver.unarchiveObjectWithData(data: data) as! MySingleton
Statics.instance = decodedInstance
} else {
Statics.instance = MySingletion()
}
}
return Statics.instance!
}
}
附带说明-我通常做的是使用Core Data对象为用户建模,因此避免了持久性带来的痛苦。我将用户作为字段保留在某些单例类上,该类专门用于保持常规应用程序状态,访问令牌等。类初始化程序从持久性中恢复用户对象,并将其分配给它的字段。
最后但并非最不重要的一点-在向应用程序中引入任何单例之前,请三思而后行,因为这种模式很容易被滥用!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句