[swift]最好的方法来存储单个实例的 RLMObject

标签: ios Swift
发布时间: 2017/3/6 23:22:35
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我正在开发 iOS 应用程序与领土作为后端数据存储。我有一个类,该类为用户配置文件 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:

您的代码示例使用计算的属性,将获取该对象从领土每次访问它。

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

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

这种类型的属性只有第一次访问它时将从领土加载对象。所有的后续访问将直接在对象。

注意的是,因为 UserProfile 是一种境界对象,其字段会自动更新,在回应中境界的基础对象所做的更改。同样地,你想做的任何更改将需要在写事务领域内包裹。

在您整体的体系结构,是什么错误在一个类似于你在做什么的境界中存储对象类型的单个实例。你可能想要给你 UserProfile 对象硬编码恒定的主键,然后使用添加或更新的版本的更新 API (见https://realm.io/docs/swift/latest/#updating-objects)。这将允许您以避免不必显式地创建一个新的对象。

赞助商