Swift ObjectMapper не вызывает didSet

Я использую ObjectMapper для заполнения свойств моего объекта Realm из некоторого JSON. Но 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 не сработает во время инициализации, но я сопоставляю после инициализации, поэтому он должен срабатывать? Я проверил проблемы github с ObjectMapper, и люди использовали didSet с ObjectMapper, поэтому я явно что-то упускаю...

Любая помощь приветствуется :)

Примечания:

  • Все свойства этого объекта заполняются, кроме filename, которое должно быть установлено внутри обратного вызова didSet.
  • Есть причина, по которой я решил не сопоставлять идентификатор, просто игнорируя это, предоставленный только для ясности.
  • Я использовал «x» и «z» в качестве имени файла, чтобы проверить, срабатывает ли он, просто игнорируйте тот факт, что они не имеют смысла, это не проблема.

person TRG    schedule 24.08.2017    source источник


Ответы (1)


Наблюдатели свойств не работают с Realm объектами. Это известное ограничение Realm из-за того, что объекты существуют в среде выполнения Objective-C (отсюда и динамический модификатор). Дополнительные сведения см. в этой проблеме GitHub. Вы можете использовать Realm, встроенные в уведомления, в качестве обходного пути для наблюдателей за свойствами.

person Dávid Pásztor    schedule 24.08.2017
comment
Спасибо, Давид (еще раз!). - person TRG; 24.08.2017