ios - 为什么 Realm addOrUpdateObject 会导致属性设置为 nil?

标签 ios objective-c swift realm

我有一个托管的 Avatar 类和一个托管的 User 类。 User 类引用了 Avatar 类:

@interface User : RLMObject
...
@property (nonatomic, retain) Avatar *avatar;
...

Avatar 类如下所示:

@interface Avatar : RLMObject
@property (nonatomic, retain) NSString *urlStr;
@property (nonatomic, retain) NSData *imageData;
@end

@implementation Avatar
+ (NSString *)primaryKey {
    return @"urlStr";
}
+ (NSArray *)requiredProperties {
    return @[@"urlStr", @"imageData"];
}
@end

在某些情况下,我已经获取了一个新用户(例如,从服务器),但为了避免重新下载头像,我想改为从数据库中获取现有用户。看起来很简单,但是在从数据库中获取现有的 Avatar 引用(使用 [Avatar objectWithPrimaryKey])并将其设置为 User 的头像属性之后,然后当我在 Realm 上调用 addOrUpdateObject 时,avatar 属性设置为 nil。没有抛出异常或调试日志,该属性只是从非零变为零。果然 User 引用在数据库中是空的,尽管 Avatar 表仍然存在。

部分代码:

检查现存头像:

    if let avatarURLStr = user.avatarURLStr, let avatarURL = URL(string: avatarURLStr) {
        if let dbAvatar = Avatar(forPrimaryKey: avatarURLStr) {
            let newAvatar = Avatar(urlStr: dbAvatar.urlStr, imageData: dbAvatar.imageData)
            user.avatar = newAvatar
        } else {
            if let data = NSData(contentsOf: avatarURL) {
                let avatar = Avatar(urlStr: avatarURLStr, imageData: data as Data!)
                user.avatar = avatar
            }
        }
    }

将用户添加到数据库:

            let realm = RLMRealm.default()
            realm.beginWriteTransaction()
            // user.avatar is non-nil here
            realm.addOrUpdate(user)
            // user.avatar is nil here
            try? realm.commitWriteTransaction()

我在 Realm 2.1.1 for Objective-C(但该项目同时使用 Swift 和 Obj-C)。

最佳答案

哦……我明白了。我稍微简化了问题的内容,结果发现我正在更新的对象之一与另一个对象有关系,而另一个对象与另一个具有化身的对象有关系。而那个头像是零。

关于ios - 为什么 Realm addOrUpdateObject 会导致属性设置为 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41029669/

相关文章:

ios - App更新后如何唤醒?

ios - Xcode 7.3.1 自动完成代码完成不起作用

objective-c - 如何在 Objective-C 中使用带有 inout 参数的 Swift 中的方法?

objective-c - NSOutputStream 完成后关闭连接

ios - 导航后导航栏损坏

iOS 一个月免费,比仅订阅

ios - Papyrus 字体存在于 iPad 上,但不存在于 iPhone 上

arrays - 为什么数组不符合 Equatable,而它的项在 Swift 中是 Equatable 的?

objective-c - 创建 NSImageCells 的 NSMatrix

ios - 如何从框架库 Xcode8 使用 MapView