ios – 在后台线程中写入Realm后,主线程看不到更新的数据

ios – 在后台线程中写入Realm后,主线程看不到更新的数据,第1张

概述>清除数据库. >进行API调用以获取新数据. >将从API检索到的数据写入后台线程中的数据库中. >从主线程上的数据库中读取数据并渲染UI. 在步骤4中,数据应该是最新数据,但我们没有看到任何数据. // remark: all main thread shared a realm objectDBManager.deleteAll()// call api success, get new >清除数据库.
>进行API调用以获取新数据.
>将从API检索到的数据写入后台线程中的数据库中.
>从主线程上的数据库中读取数据并渲染UI.

在步骤4中,数据应该是最新数据,但我们没有看到任何数据.

// remark: all main thread shared a realm objectDBManager.deleteall()// call API success,get newdatadispatchQueue.global(qos: .background).async {     DBManager.initDBData(<newdata>)    dispatchQueue.main.async {        print("has data?????",DBManager.getBrands().count)     } }// when writefunc write() {    let realmBackgroud = try! Realm()    try! realmBackgroud.write {} }
解决方法 具有runloops的线程上的Realm实例,例如主线程,update to the latest version of the data in the Realm file,因为通知被发布到其线程的runloop.在后台线程上提交写入事务与另一个线程的runloop接收到该通知之间存在时间窗口,并且由于CFRunLoop相对于其通知源处理其调度队列的顺序,对于dispatch_async而言,这种情况并不罕见.在提交通知之前,在提交写入事务之后立即执行主队列.

有几种方法可以解决此问题:

>使用Realm的通知机制之一(例如集合通知)来响应您在后台线程上所做的更改,而不是显式地使用dispatch_async.
>显式调用发送到主队列的块顶部的Realm.refresh(),使其自身进入最新版本,无论该线程是否有机会处理触发自动刷新的通知.

总结

以上是内存溢出为你收集整理的ios – 在后台线程中写入Realm后,主线程看不到更新的数据全部内容,希望文章能够帮你解决ios – 在后台线程中写入Realm后,主线程看不到更新的数据所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1100667.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存