[英]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.