代码之家  ›  专栏  ›  技术社区  ›  Vin Gazoil

排序本地化数据的领域查询问题

  •  1
  • Vin Gazoil  · 技术社区  · 7 年前

    考虑以下领域模型:

    class Fruit: Object {
        @objc dynamic var name = ""
        let localizations = List<Localization>()
    
        /** 
            Returns the localized name of the fruit matching the preferred language of the app 
            or self.name if the fruit does not have a localization matching the user preferred language codes. 
        */
        var localizedName: String? {
            guard !Locale.isPreferredLanguageDefaultAppLanguage else { return self.name }
    
            let preferredLanguagesCodes = Locale.preferredLanguagesCodes
            let localizations = preferredLanguagesCodes.compactMap({ languageCode in Array(self.localizations).filter({ $0.languageCode == languageCode }).first })
            return localizations.first?.localizedName ?? self.name
        }
    }
    
    class Localization: Object {
        @objc dynamic var localizedName: String = ""
        @objc dynamic var languageCode: String = ""
    }
    

    假设我的数据库中有两个水果(为了简单起见,用JSON格式表示):

    [
        {
            "name": "Apple",
            "localizations": [
                {
                    "localizedName": "Pomme",
                    "languageCode": "fr"
                }
            ]
        },
        {
            "name": "Banana",
            "localizations": [
                {
                    "localizedName": "Banane",
                    "languageCode": "fr"
                }
            ]
        }
    ]
    

    现在我想把我数据库里所有的水果,按照它们的字母顺序分类 localizedName .

    var localizedNameSortingBlock: ((Fruit, Fruit) -> Bool) = {
        guard let localizedNameA = $0.localizedName, let localizedNameB = $1.localizedName else { return false }
        return localizedNameA.diacriticInsensitive < localizedNameB.diacriticInsensitive
    }
    
    let sortedFruits = Array(Realm().objects(Fruit.self)).sorted(by: localizedNameSortingBlock)
    

    1. 苹果

    如果设置为“法语”:

    1. 香蕉

    很简单,但是这个解决方案有一个很大的不便:

    通过铸造 Results<Fruit> 集合到一个数组中,我失去了通过Realm的通知令牌系统获取实时更新的能力。

    问题是,我不能用 NSPredicate 本地化名称

    我想写 本地化名称 价值直接进入 name Fruit 对象,但这样做需要遍历所有水果,并在用户更改首选语言时更改其名称。一定有更好的办法。

    所以我的问题是:

    本地化名称 ,而不失去从领域接收批量更新的能力?

    0 回复  |  直到 7 年前
    推荐文章