我的数据库有 500,000 条记录。这些表没有主键,因为 Realm 不支持复合主键。我在后台线程中获取数据,然后我想将其显示在主线程的 UI 中。但由于 Realm 对象无法跨线程共享,因此我无法使用在后台获取的记录。相反,我需要在主线程上重新获取记录?如果我从 500,000 条记录中获取一条记录,它将阻塞主线程。我不知道该如何处理。我使用 Realm 因为它说它足够快。如果我需要多次重新获取记录,它真的比 SQLite 更快吗?我不想创建另一个将其他列组合为主键的属性,因为 Realm 数据库已经比 SQLite 文件大。
@objc class CKPhraseModel: CKBaseHMMModel{
dynamic var pinyin :String!
dynamic var phrase :String = ""
class func fetchObjects(apinyin :String) -> Results<CKPhraseModel> {
let realm = Realm.createDefaultRealm()
let fetchString = generateQueryString(apinyin)
let phrases = realm.objects(self).filter(fetchString).sorted("frequency", ascending: false)
return phrases
}
func save(needTransition :Bool = true) {
if let realm = realm {
try! realm.write(needTransition) {[unowned self] in
self.frequency += 1
}
}
else {
let realm = Realm.createDefaultRealm()
if let model = self.dynamicType.fetchObjects(pinyin).filter("phrase == %@", phrase).first {
try! realm.write(needTransition) {[unowned self] in
model.frequency += self.frequency
}
}
else {
try! realm.write(needTransition) {[unowned self] in
realm.add(self)
}
}
}
}
}
然后我将获取的记录存储在数组中
let userInput = "input somthing"
let phraseList = CKPhraseModel().fetchObjects(userInput)
for (_,phraseModel) in phraseList.enumerate() {
candidates.append(phraseModel)
}
然后,当用户单击其中之一时,我想在 UI 中显示 candidates
信息。我将调用 CKPhraseModel 的 save
函数来保存更改。此步骤在主线程上。
最佳答案
如果您使用其延迟加载功能,Realm 会很快,这意味着您创建一个过滤器,直接从 Realm 返回您的候选
,因为这样您只需要检索元素您在结果中建立索引。
在您的情况下,您复制所有元素。这有点慢,这就是你最终卡住的原因。
关于swift - 如何使用 Realm 提高大型数据集的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38352016/