繁体   English   中英

iOS(Swift)Singleton Realm对象

[英]iOS (Swift) Singleton Realm Object

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

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

Realm似乎是保存和检索数据的好方法。 进一步查看后,似乎我需要有一个数据模型才能使用Realms。 在将Object集成到下面显示的Profile.swift失败后,我需要一些帮助来解决这个问题。 我应该创建第二个类ProfileDataModel ,可以被Profile调用以检索和保存更改,还是有办法将Realm 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
    }
}

我建议您创建一个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
    }
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM