我对Realm并不陌生,现在我正面临标题中提到的问题。基本上,我的Realms
之一是User
中的Users
类(与新用户登录时创建的Realm Cloud
不同) 。该类具有userId
属性,该属性设置为其主键。现在,我尝试通过以下代码行获取特定主键的用户:
let user = realm?.object(ofType: User.self, forPrimaryKey: "f677ca48b17bc7b90a886dd5d50148c1")
我确实看到云中有一个具有此主键的用户,但是并不总是返回该用户。我的意思是说,如果我运行相同的代码10次,我将使用户仅10次获得4次(大约)。上面的代码从一个方法运行,该方法总是在控制器显示在屏幕上时调用。此外,该方法中没有针对该部分代码的条件检查,因此始终在调用该方法时调用它。
我还检查了realm
属性,但它不是nil
,所以我不太明白为什么会发生这种情况。
当我尝试按行获取当前用户时,也会发生同样的情况:
currentUser = realm?.object(ofType: User.self, forPrimaryKey: SyncUser.current?.identity)
identity
的值不是nil(我在调用代码之前将其打印出来)。
已更新
User
的外观如下:
class User: Object {
@objc dynamic var userId: String = ""
@objc dynamic var name: String = ""
override static func primaryKey() -> String? {
return "userId"
}
}
也许,我不知道有什么东西,或者那是云方面的问题/错误,我不知道。如果您遇到这样的问题和/或知道是什么原因引起的,我们将非常感谢您的帮助。预先感谢。
答案 0 :(得分:0)
这是由于当您尝试访问不在主线程上并由其他线程处理的引用时可能弹出竞争条件而引起的。
因此,当您尝试从主线程调用它时,大多数时候它每次都会返回nil,因为Realm
在您直接访问它时还没有机会进行写入或读取。
做什么:
请确保您在User
对象中的属性标记为dynamic
。
需要使用dynamic
修饰符声明Object子类的属性,以允许
Realm
覆盖属性的getter和setter。否则,Swift编译器将访问对象的实例 直接变量,这不会为Realm提供任何机会 从Realm文件读取或写入数据。
也请阅读this答案。