Swift ObjectMapper没有调用didSet

时间:2017-08-24 12:49:31

标签: swift swift3 realm objectmapper

我正在使用ObjectMapper从一些JSON填充我的Realm对象的属性。但是,只要didSet更改remotePath属性,就不会调用Mapper

这是我班级的精简版本(我刚刚删除了一堆属性以保持简洁)

class ImageFile: Object, Mappable  {   

    dynamic var id = 0

    dynamic var filename = ""

    dynamic var remotepath = "" {

        didSet {

            self.filename = self.remotepath.isEmpty ? "x" : "z"

        }

    }


    required convenience init?(map: Map) {

        self.init()

    }    

    override static func primaryKey() -> String? {

        return "id"

    }



    func mapping(map: Map) {

        remotepath <- map[“path"]

    }     

}

我这样调用它:

let file = ImageFile()
file.id = json["fileId"].int

// Map the properties
file.mapping(map: Map(mappingType: .fromJSON, JSON: json.dictionaryObject ?? [:]))

我已经尝试在didSet中放置一个断点以及打印只是为了查看它是否正在触发它不是/但是如果我检查数据库,我确实在remotepath属性中看到了正确的值,所以它是肯定被填补。

我知道didSet在init期间不会触发,但是我在init之后映射所以它应该触发?我已经检查过ObjectMapper上的github问题,并且人们使用了带有ObjectMapper的didSet,所以我显然错过了一些东西...

非常感谢任何帮助:)

注意:

  • 此对象的所有属性都被填入,除了filename一个应该在didSet回调中设置的属性。
  • 有一个原因,我选择不映射ID,只是为了清楚起见,忽略它。
  • 我使用“x”和“z”作为文件名只是为了测试它是否被触发,只是忽略它们没有意义的事实,这不是问题。

1 个答案:

答案 0 :(得分:1)

财产观察员不在Realm个对象上工作。这是Realm的一个已知限制,因为Objective-C运行时中存在对象(因此是动态修饰符)。有关详细信息,请参阅this GitHub问题。您可以使用Realm内置通知作为属性观察者的变通方法。