创建具有所有关系的RLMObject的未实例化副本也是未实例化的

时间:2016-03-03 21:48:13

标签: ios objective-c realm

假设我创建了一个有关系的RLMObject,我将继续保存在我的领域数据库中。完成后,我决定在新创建的对象上调用initWithValues并将此复制的对象返回到前端以供使用。我注意到它与之有关系的对象仍然被认为是实例化的。

有没有办法让我在调用initWithValues创建我的对象的未实例化副本时,确保我的所有属性都是未实例化的?

2 个答案:

答案 0 :(得分:0)

没有内置的方法来实现这一目标。您需要自己创建对象的独立副本。关系可能是循环的,因此对此的通用解决方案将是非平凡的。

答案 1 :(得分:0)

例如,如果我理解正确,您可以在每个托管类中实现NSCopying协议:

- (instancetype)copyWithZone:(NSZone *)zone {
    //SomeClass *object = (SomeClass *)[super.class allocWithZone:zone];
    SomeClass *object = [SomeClass new];
    object->_isClone = YES;
    object->_name = self.name.copy;
    object->_age = self.age;
    return object;
}

然后,在删除原件后,副本仍然可用。

还可以在NSCopying的类别中实施RLMResults协议:

- (instancetype)copyWithZone:(NSZone *)zone {
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:self.count];
    for (RLMObject *object in self) {
        [array addObject:object.copy];
    }
    return array.copy;
}


使用案例:

RLMResults *objects = [SomeObject objectsWhere:@"ANY nested.age < 99"];
NSArray<SomeObject*> *clones = objects.copy;