Объекты Link Realm при использовании Codable - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу связать раздел с моей моделью категории. Я получаю только идентификатор раздела в ответе JSON, поэтому, используя кодер, я попытался сделать вот так, но не сработало

Решение ниже не сработало

public required convenience init(from decoder: Decoder) throws {
    self.init()
    let container = try decoder.container(keyedBy: CodingKeys.self)
    self.id = try container.decode(Int.self, forKey: .id)
    self.name = try container.decode(String.self, forKey: .name)
    self.color = try container.decodeIfPresent(String.self, forKey: .color) ?? ""
    let sectionId = try container.decode(Int.self, forKey: .section)
    let section = try! Realm().object(ofType: Section.self, forPrimaryKey: sectionId)
    self.section = section

}

Мое решение, но мне не нравится тот факт, что он будет запускать запрос каждый раз

final class Category : Object, Codable {

@objc dynamic var id: Int = 0
@objc dynamic var name: String = ""
@objc dynamic var color: String? = ""
@objc dynamic var sectionId: Int = 0
var section: Section? {
    return self.realm?.object(ofType: Section.self, forPrimaryKey: sectionId)
}

Я уверен, что должен быть лучший способ сделать это. Любые лиды приветствуются.

1 Ответ

1 голос
/ 25 февраля 2020

Если вы используете переменную lazy для свойства section, запрос будет выполнен только один раз. Недостатком является то, что если вы наблюдаете изменения в объектах категории, вы не получите уведомление, если соответствующий объект раздела изменится.

class Category: Object {
    // ...
    @objc dynamic var sectionId: Int = 0

    lazy var section: Section? = {
        return realm?.object(ofType: Section.self, forPrimaryKey: sectionId)
    }()

    override static func ignoredProperties() -> [String] {
        return ["section"]
    }
}
...