考虑以下领域模型:
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)
-
苹果
-
如果设置为“法语”:
-
香蕉
-
很简单,但是这个解决方案有一个很大的不便:
通过铸造
Results<Fruit>
集合到一个数组中,我失去了通过Realm的通知令牌系统获取实时更新的能力。
问题是,我不能用
NSPredicate
本地化名称
我想写
本地化名称
价值直接进入
name
Fruit
对象,但这样做需要遍历所有水果,并在用户更改首选语言时更改其名称。一定有更好的办法。
所以我的问题是:
本地化名称
,而不失去从领域接收批量更新的能力?