读取/写入数据 NSCoding iOS - Singelton 与否?
Read / Write Data NSCoding iOS - Singelton or Not?
这已被问过很多次,但我仍处于十字路口。
我的应用程序需要保存数据,可以通过应用程序的许多区域访问此数据。
我想避免核心数据,因为它对于我需要保存 3-4 个简单不同的东西来说太过分了 类。
所以我正在使用 NSCoding,它的工作没有问题。
我并没有纠结于什么是访问这些存储数据的“最佳”方式。
本质上,不管是不是单例。阅读了各种帖子,大多数人都说避免使用单例。
这个问题变得很明显,因为我当前的设计使用单例对象来为我提供一种轻松访问光盘数据的方法。问题是测试......找不到克服无法测试的方法 - 这是我决定问我是否应该使用这种模式的时候。
那么,访问我的数据的更好方法是什么 - 允许从我的应用程序中的任何地方读取和写入。
使用单例,只是不要测试 - 或者创建一个新实例,并要求该实例检索我的数据。我也不想传递数据 - 我希望能够轻松访问数据 - 读写(使用标签栏控制器等)
这是我的单例实现
class InvalidClientCollection {
static var errorList = InvalidClientCollection.loadErrataClients()
static private let kErrataClientSaveFileName = "errorClientsFile"
static var clientCount:Int {
get {
return errorList.count
}
}
static func loadErrataClients() -> [Client] {
let mysavefile = FilePath(fileName: kErrataClientSaveFileName).filePath
if let data = NSKeyedUnarchiver.unarchiveObjectWithFile(mysavefile) as? [Client] {
return data
}
return [Client]()
}
static func saveErrataClientList() {
let mysavefile = FilePath(fileName: kErrataClientSaveFileName).filePath
NSKeyedArchiver.archiveRootObject(errorList, toFile: mysavefile)
}
}
我应该重新设计,所以为了获得我的数据我会
let mycolleection = InvalidClientCollection()
let mystuff = mycollection.errorList
我猜是这样的?
class InvalidClientCollection {
var errorList:[Client] {
get {
return loadErrataClients()
}
set {
self.errorList = newValue
// maybe even save at same time
//saveErrataClientList()
}
}
// etc...
}
任何想法 - 改进代码将不胜感激。
是的,为此避免单例是一个好计划。一个简单的解决方案是创建数据的单个实例 class 并在应用程序委托中将引用作为 属性 保留。从任何 class 访问应用程序委托都很容易。然后从那里您可以访问 属性。这消除了单例并使测试更容易。
另一种选择是将所需的数据实例传递给应用程序中的每个视图控制器。这样做的好处是不假设应用程序只需要一个数据实例。这可以通过将数据实例传递给根视图控制器在应用程序委托中启动。然后根控制器可以将它传递给它呈现或推送的任何视图控制器,等等。通过 subclassing UIViewController
并让你的所有视图控制器扩展你的基础 class. UIViewController
类别更好。
这已被问过很多次,但我仍处于十字路口。
我的应用程序需要保存数据,可以通过应用程序的许多区域访问此数据。
我想避免核心数据,因为它对于我需要保存 3-4 个简单不同的东西来说太过分了 类。
所以我正在使用 NSCoding,它的工作没有问题。
我并没有纠结于什么是访问这些存储数据的“最佳”方式。
本质上,不管是不是单例。阅读了各种帖子,大多数人都说避免使用单例。
这个问题变得很明显,因为我当前的设计使用单例对象来为我提供一种轻松访问光盘数据的方法。问题是测试......找不到克服无法测试的方法 - 这是我决定问我是否应该使用这种模式的时候。
那么,访问我的数据的更好方法是什么 - 允许从我的应用程序中的任何地方读取和写入。
使用单例,只是不要测试 - 或者创建一个新实例,并要求该实例检索我的数据。我也不想传递数据 - 我希望能够轻松访问数据 - 读写(使用标签栏控制器等)
这是我的单例实现
class InvalidClientCollection {
static var errorList = InvalidClientCollection.loadErrataClients()
static private let kErrataClientSaveFileName = "errorClientsFile"
static var clientCount:Int {
get {
return errorList.count
}
}
static func loadErrataClients() -> [Client] {
let mysavefile = FilePath(fileName: kErrataClientSaveFileName).filePath
if let data = NSKeyedUnarchiver.unarchiveObjectWithFile(mysavefile) as? [Client] {
return data
}
return [Client]()
}
static func saveErrataClientList() {
let mysavefile = FilePath(fileName: kErrataClientSaveFileName).filePath
NSKeyedArchiver.archiveRootObject(errorList, toFile: mysavefile)
}
}
我应该重新设计,所以为了获得我的数据我会
let mycolleection = InvalidClientCollection()
let mystuff = mycollection.errorList
我猜是这样的?
class InvalidClientCollection {
var errorList:[Client] {
get {
return loadErrataClients()
}
set {
self.errorList = newValue
// maybe even save at same time
//saveErrataClientList()
}
}
// etc...
}
任何想法 - 改进代码将不胜感激。
是的,为此避免单例是一个好计划。一个简单的解决方案是创建数据的单个实例 class 并在应用程序委托中将引用作为 属性 保留。从任何 class 访问应用程序委托都很容易。然后从那里您可以访问 属性。这消除了单例并使测试更容易。
另一种选择是将所需的数据实例传递给应用程序中的每个视图控制器。这样做的好处是不假设应用程序只需要一个数据实例。这可以通过将数据实例传递给根视图控制器在应用程序委托中启动。然后根控制器可以将它传递给它呈现或推送的任何视图控制器,等等。通过 subclassing UIViewController
并让你的所有视图控制器扩展你的基础 class. UIViewController
类别更好。