Swift 如何使用Realm提高大型数据集的性能?

Swift 如何使用Realm提高大型数据集的性能?,swift,realm,Swift,Realm,我的数据库有500000条记录。这些表没有主键,因为Realm不支持复合主键。我在后台线程中获取数据,然后我想在主线程的UI中显示它。但是由于领域对象不能跨线程共享,我不能使用在后台获取的记录。相反,我需要在主线程上重新蚀刻记录?如果我从500000条记录中提取一条记录,它将阻塞主线程。我不知道怎么处理它。我使用领域,因为它说它足够快。如果我需要多次刷新记录,它真的比SQLite快吗?我不想创建另一个将其他列合并为主键的属性,因为领域数据库已经比SQLite文件大 @objc class CKP

我的数据库有500000条记录。这些表没有主键,因为Realm不支持复合主键。我在后台线程中获取数据,然后我想在主线程的UI中显示它。但是由于领域对象不能跨线程共享,我不能使用在后台获取的记录。相反,我需要在主线程上重新蚀刻记录?如果我从500000条记录中提取一条记录,它将阻塞主线程。我不知道怎么处理它。我使用领域,因为它说它足够快。如果我需要多次刷新记录,它真的比SQLite快吗?我不想创建另一个将其他列合并为主键的属性,因为领域数据库已经比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)
                }
            }
        }
    }
}

然后,当用户单击其中一个时,我想在UI中显示
候选对象
信息。我将调用CKPhraseModel的
save
函数来保存更改。这一步在主线程上。

领域如果使用其延迟加载功能,则速度很快,这意味着您可以创建一个过滤器,直接从领域返回您的
候选对象,因为这样您只需要检索结果中的索引元素


在本例中,您将复制所有元素。这有点慢,这就是为什么你最终会被冻结。

Realm在主线程和后台线程中工作得非常好。问题是您不能跨线程传递Realm、RealmObject或RealmResults。因此,在您的用例中,从后台线程获取记录将数据存储在领域的后台线程中,并使用领域的异步方法从主线程的领域中获取记录。如果您正在寻找一些实际代码@viraji从后台线程获取记录,请遵循以下示例。然后,我将获取的记录存储在一个数组中。我在UI上显示它。如果用户单击其中一个。我将其存储在域中的后台线程中。线程行是这样的:
background-thread=>main-thread=>background-thread
,如果我多次获取相同的记录。是否会降低应用程序性能?我的应用程序通过用户输入一个单词来执行这个过程。因此,在大数据库中获取数据和存储数据非常频繁。当然,避免这样做会降低性能。此流看起来不错,除了为什么用户单击其中一条记录时要获取增益,为什么不使用开始时存储数据的数组。@VirajTank是的,我将获取的记录存储在数组中。但我不能在主线程中使用它。我不能在存储数据后台线程中使用它。我很困惑。如果我不执行phraseList.enumerate(){candidates.append(phraseModel)}
中的
let userInput=“input somthing”let phraseList=CKPhraseModel().fetchObjects(userInput)for(u,phraseModel)来复制结果。如何在主线程的UI中显示候选对象?结果在后台线程中获取。我不明白。我该怎么做?…但是如果结果被复制并从后台提取到UI,那么这甚至不应该冻结。错误在别处。当我执行for循环时,我将其更改为创建一个新的
CKPhraseModel
,它不由Realm管理,以复制
phraseModel
中所有
phraseModel
的属性。所以我可以在UI线程中使用它。因为对象不是由领域管理的,所以我可以跨线程使用它。我没有什么好主意来处理它。我不知道我是否被误解了!那么,您应该在这里阅读更多关于领域查询的内容:
let userInput = "input somthing"
let phraseList = CKPhraseModel().fetchObjects(userInput)
for (_,phraseModel) in phraseList.enumerate() {
     candidates.append(phraseModel)
}