存储单个RLMObject实例的最佳方法

时间:2016-07-31 00:24:53

标签: ios swift realm

我目前正在开发一个iOS应用程序,Realm作为后端数据存储。我有一个类,它是用户配置文件的RLMObject。它存储了他们的名字,个人资料图片,统计数据等。

应该只有这些对象中的一个,但是我知道实现单例模式通常是个坏主意。目前我将其实现为

//AppDelegate.swift, applicationDidFinishLaunching
//If there's no user profiles yet (first time launch), create one

if UserProfile.allObjects().count == 0 {
    let realm = RLMRealm.defaultRealm()
    try! realm.transactionWithBlock() {
        realm.addObject(UserProfile())
    }
}


//ProfileViewController.swift
//Get the first UserProfile
var userProfile: UserProfile? {
        get { 
            return UserProfile.allObjects().objectAtIndex(0) as? UserProfile 
        }
}

有没有更好的方法来跟踪此类的单个实例?

1 个答案:

答案 0 :(得分:1)

您的代码示例使用计算属性,每次访问时都会从Realm中获取对象。

相反,请尝试使用lazy var属性:

lazy var userProfile: UserProfile? = { 
    return UserProfile.allObjects().objectAtIndex(0) as? UserProfile 
}()

这种类型的属性仅在第一次访问时才从Realm加载对象。所有后续访问都将直接访问该对象。

请注意,由于UserProfile是一个Realm对象,因此其字段将自动更新以响应对Realm中底层对象所做的更改。同样,您希望进行的任何更改都需要包含在领域write transaction中。

就整体架构而言,在Realm中存储对象类型的单个实例与您正在执行的操作类似,没有任何问题。您可能希望为UserProfile对象提供硬编码的常量主键,然后使用更新API的“添加或更新”版本(请参阅https://realm.io/docs/swift/latest/#updating-objects)。这样可以避免显式创建新对象。

相关问题