全局领域对象:单例还是每次获取?

时间:2018-10-25 16:23:44

标签: swift realm singleton

在我的应用中,我需要全局访问currentUser,它是User类的实例,定义如下:

class User: Object{
  @objc dynamic var recordName = UUID().uuidString
  @objc dynamic var name = ""
  @objc dynamic var email = ""
  @objc dynamic var photo: Data? = nil

  override static func primaryKey() -> String? {
    return "recordName"
  }
}

currentUser是在应用启动时建立的,我在我的应用中几乎所有地方都经常提到它。

我注意到,有时我会收到一个错误,该错误似乎是由于在不同位置引用此currentUser引起的:

  

从错误的线程访问领域

在大多数情况下,我能够跟踪Realm处于哪个线程,但是很难涵盖所有情况。所以这引出了我的问题。

是否存在将currentUser对象设置为单例一次的安全方法?还是应该将其ID保存到磁盘,然后在每次需要时从Realm中获取对象(如下所示)?

let realm = try! Realm()
if let currentUserId = defaults.string(forKey: "currentUserId"), let user = realm.object(ofType: User.self, forPrimaryKey: currentUserId){
  currentUser = user
}

我正在Xcode 10上使用Swift 4.2。谢谢!

1 个答案:

答案 0 :(得分:2)

只要您可以确保始终从同一线程访问currentUser对象,就可以一次将其设置为全局可访问对象,并使用对该对象的自动更新引用而不用重新访问它-每次都从Realm获取。

您可以通过在Realm / currentUser上创建一个专用于Realm的线程并始终将其分派到该线程,或者仅从系统线程(例如DispatchQueue.main进行此操作)来实现此目的。