2017-08-08 38 views
2

我想我偶然发现了RealmSwift中的一些未定义的行为。LinkObjects属性在保存到Realm数据库之前发生打印时清空

在狗类中的 “反向引用” 属性被定义这样:

let backReferences = LinkingObjects(fromType: Person.self, property: "dogs") 

我创建了两个对象,其中人父狗:

self.realm = try! Realm() 

let person = Person() 
person.firstName = "Paul" 
person.secondName = "Brewczynski" 

let dog = Dog() 
dog.name = "MyDogName" 

person.dogs.append(dog) // Right now this dog is mine 

然后:

//print("BackReferebces print #0 - on yet unmanaged realm Object") 
//print(dog.backReferences) 
try! realm!.write { 
    realm?.add(person) // Writing person to db, with dog reference 
    print("BackReferences print #1") 
    print(dog.backReferences) 
} 

print("BackReferences print #2") 
print("Show backReferences in using my orginal reference to dog \(dog.backReferences)") 
print("BackReferences print #3") 
print("Show backReferences using Persons's reference \(person.dogs.first!.backReferences)") 

它完美的工作(打印正确反向引用人持有狗),直到你取消注释2第一行,并在由Realm管理之前打印狗的后退参考。

然后在打印#1和#2我得到空单:

BackReferences print #1 
LinkingObjects<> <0x7fa0d1611c00> (

) 
BackReferences print #2 
Show backReferences in using my orginal reference to dog LinkingObjects<> <0x7fa0d1611c00> (

) 

为什么会这样?我偶然发现了一些Realm的未定义行为?

整体的AppDelegate文件:

https://gist.github.com/pbrewczynski/8ebc3cb5796850008a90f79dbee6bd04

回答

1

这似乎是预期的行为。虽然这是不完全记录任何地方,在this GitHub的问题一个境界工程师提到,

LinkingObjects始终返回非托管对象的空集合。

的唯一提示这个我能找到documentation是句子

LinkingObjects总是反映当前线程的境界的当前状态,

然而,这ISN”对于只有托管对象是Realm的一部分这一事实才真正明确,因此非托管对象不能在当前线程上成为Realm状态的一部分。

总而言之,您始终需要在Realm之前坚持对象,然后才能按其预期的方式运行LinkingObjects属性。

相关问题