Объект Глобального Царства: Синглтон или Принимать его каждый раз? - PullRequest
0 голосов
/ 25 октября 2018

В моем приложении мне нужен глобальный доступ к 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 в разных местах:

Доступ к области из неверного потока

Я могу отслеживать, в каком потоке находится область большую часть времени, но трудно охватить все случаи.Так что это подводит меня к моему вопросу.

Есть ли безопасный способ установить объект 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
}

Я использую Swift 4.2 на Xcode 10. Спасибо!

1 Ответ

0 голосов
/ 25 октября 2018

Пока вы можете быть уверены, что вы всегда получаете доступ к своему currentUser объекту из одного и того же потока, можно один раз настроить его как глобально доступный объект и использовать эту автоматически обновляемую ссылку на него вместо повторной выборки.каждый раз из Realm.

Этого можно достичь, создав выделенный поток в Realm и всегда отправляя его в этот поток перед доступом к Realm / currentUser, или просто сделав это из системного потока, такого как * 1005.*.

...