iOS(Swift)Singleton领域对象

时间:2016-07-03 02:42:28

标签: ios xcode swift singleton realm

阅读this教程后,我需要一些帮助来了解最有效的方法。

当我的应用程序打开时,它需要加载Profile对象。由于在应用程序的生命周期中应该只有其中一个,我将其设置为单身。

Realm似乎是保存和检索数据的好方法。进一步查看后,似乎我需要有一个数据模型才能使用Realms。在尝试将Object集成到下面显示的Profile.swift失败后,我需要一些帮助来解决这个问题。我应该创建可以由ProfileDataModel调用以检索和保存更改的第二个类Profile,还是可以将域Object包含到Singleton类中?

Profile.swift

class Profile {

    //MARK: Singleton
    static let sharedInstance = Profile()

    //MARK: Properties
    var characterName: String
    var level: Int

    //MARK: Init
    private init() {
        //TODO: Load from realms
        self.characterName = "John Appleseed"
        self.level = 50
    }

    //MARK: Helper Methods
    static func save(){
        //TODO: Save to Realm
    }
}

2 个答案:

答案 0 :(得分:9)

我建议您创建一个db manager类来处理它上面的所有数据库操作,然后您可以单独创建数据模型并使用您的manager类来获取/存储数据库上的数据。

class DBManager {
//MARK: Singleton
static let sharedInstance = DBManager()

//MARK: Init
private override init(){
    let config = Realm.Configuration(
        fileURL: dbPath,
        readOnly: false)
    do{
        myDB = try Realm(configuration: config)
        print(dbPath)
    }
    catch{
        print("boooom")
    }

}

    //retrive data from db
    func getDataFromDB() -> Results<DataModel>{
    let results: Results<NewsModel> = myDB.objects(DataModel)
    return results
    }

    //write an object in db
    func addDataModelEntry(object: DataModel){
        try! myDB.write{
            myDB.add(object, update: true)
        }
    }

}

//your controller you want to use your db manager class
class main(){ 
    func viewDidLoad(){
       DBManager.sharedInstance.getDataFromDB() ///here you have realm results

       DBManager.sharedInstance.addDataModelEntry(customDataModel) //to store your object on db
    }
}

我只是为了说明这样做而设置了一些示例,您可以使用这些函数扩展到任何类型的数据库操作,以满足您的特定需求。

答案 1 :(得分:3)

正如您已经建议的那样,在Realm托管对象上实现Singleton模式不是一个好主意。它们绑定到一个线程,只能从写入事务中修改。

相反,如果您需要共享可变全局状态并希望在Realm中保留它,我建议您使用一个允许您检索对象的类,这些对象仅用于描述持久化数据。例如。一个DatabaseManager作为单例,它实例化一个新的Realm并返回单个现有的Profile对象,继承自Object但没有自定义static属性或方法。