读/写数据NSCoding iOS - Singelton还是不?

时间:2015-09-12 22:34:32

标签: ios design-patterns singleton nscoding

这已被多次询问,但我还处于十字路口。

我的应用程序需要保存数据,这些数据可以通过应用程序的许多区域进行访问。

我想避免使用核心数据,因为对于我需要保存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...
}

任何想法 - 改进的代码将非常感激。

1 个答案:

答案 0 :(得分:1)

是的,为此避免单身是一个好计划。一个简单的解决方案是创建数据类的单个实例,并将引用作为应用程序委托中的属性。从任何课程访问应用代理都很容易。然后从那里您可以进入酒店。这消除了单例并使测试更容易。

另一种选择是将所需的数据实例传递给应用程序中的每个视图控制器。这样做的好处是不能假设应用程序只需要一个数据实例。这可以通过将数据实例传递给根视图控制器在app委托中开始。然后根控制器可以将它传递给它呈现或推送的任何视图控制器等。通过继承UIViewController并让所有视图控制器扩展您的基类,这变得更容易。 UIViewController类别甚至更好。