Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何跟踪域中列表对象的上一个父对象_Ios_Swift_Realm_Realm List - Fatal编程技术网

Ios 如何跟踪域中列表对象的上一个父对象

Ios 如何跟踪域中列表对象的上一个父对象,ios,swift,realm,realm-list,Ios,Swift,Realm,Realm List,假设我有这些东西 class Person { @objc dynamic var personID = "" var pets = List<Pet>() override class func primaryKey() -> String? return "personID" } } class Pet { @objc dynamic var petID = "" priv

假设我有这些东西

class Person {
  @objc dynamic var personID = ""

  var pets = List<Pet>()

  override class func primaryKey() -> String?
     return "personID"
  }
}

class Pet {
  @objc dynamic var petID = ""

  private let owners = LinkingObjects(fromType: Person.self, property: "pets")
  var owner: Person? { return owners.first }

  override class func primaryKey() -> String?
     return "petID"
  }
}
然后对同一个人用不同的宠物做两个作业

作业1

john.pets = [dog, cat]
也就是说

dog.owner = john
cat.owner = john
bird.owner = nil 
dog.owner = nil
cat.owner = john
bird.owner = john
作业2

john.pets = [cat, bird]
也就是说

dog.owner = john
cat.owner = john
bird.owner = nil 
dog.owner = nil
cat.owner = john
bird.owner = john

狗现在成了孤儿。有没有办法追踪约翰养的那只狗?

这是个超级问题!为了清楚起见,这样做不会产生相反的关系。创建该链接需要
john.pets.append(dog)
john.pets.append(objectsIn:[dog,cat])
。由于这些对象是引擎盖下的Objc,因此一种方法是KVO。这样,如果添加了宠物,则会触发一个事件,使宠物能够被存储,但在宠物中,会与该主人一起更新priorOwner属性。如果宠物被移除,priorOwner属性将保持不变。但是,您不能在LinkingObject上执行KVO,虽然您可以在列表上执行KVO,但如果它仅在内存中,则无法执行此操作-它仅在列表对象被管理后才可用。目前还没有解决方案,但也许其他人有想法扩展这种方法。另一个问题是链接对象-注意,它是复数形式。我个人不喜欢它,因为它不会创建一对多的关系,它会创建一个多对多的关系,所以你必须围绕它编写代码来保证奇点。所以从技术上讲,一只宠物可以有多个主人;在这种情况下,您的对象将返回所有者属性中的第一个所有者。这是一个超级问题!为了清楚起见,这样做不会产生相反的关系。创建该链接需要
john.pets.append(dog)
john.pets.append(objectsIn:[dog,cat])
。由于这些对象是引擎盖下的Objc,因此一种方法是KVO。这样,如果添加了宠物,则会触发一个事件,使宠物能够被存储,但在宠物中,会与该主人一起更新priorOwner属性。如果宠物被移除,priorOwner属性将保持不变。但是,您不能在LinkingObject上执行KVO,虽然您可以在列表上执行KVO,但如果它仅在内存中,则无法执行此操作-它仅在列表对象被管理后才可用。目前还没有解决方案,但也许其他人有想法扩展这种方法。另一个问题是链接对象-注意,它是复数形式。我个人不喜欢它,因为它不会创建一对多的关系,它会创建一个多对多的关系,所以你必须围绕它编写代码来保证奇点。所以从技术上讲,一只宠物可以有多个主人;在这种情况下,对象将返回owners属性中的第一个所有者。