Ios 在后台线程中写入域后,主线程不会';看不到更新的数据 清除数据库 进行API调用以获取新数据 将从API检索到的数据写入后台线程中的数据库 在主线程上从数据库读取数据并呈现UI
在步骤4中,数据应该是最新的数据,但我们没有看到任何数据Ios 在后台线程中写入域后,主线程不会';看不到更新的数据 清除数据库 进行API调用以获取新数据 将从API检索到的数据写入后台线程中的数据库 在主线程上从数据库读取数据并呈现UI,ios,swift,multithreading,realm,Ios,Swift,Multithreading,Realm,在步骤4中,数据应该是最新的数据,但我们没有看到任何数据 // remark: all main thread shared a realm object DBManager.deleteAll() // call api success, get newdata DispatchQueue.global(qos: .background).async { DBManager.initDBData(<newdata>) DispatchQueue.main.asyn
// remark: all main thread shared a realm object
DBManager.deleteAll()
// call api success, get newdata
DispatchQueue.global(qos: .background).async {
DBManager.initDBData(<newdata>)
DispatchQueue.main.async {
print("has data?????", DBManager.getBrands().count)
}
}
// when write
func write() {
let realmBackgroud = try! Realm()
try! realmBackgroud.write {}
}
//备注:所有主线程共享一个领域对象
DBManager.deleteAll()
//调用api成功,获取新数据
DispatchQueue.global(qos:.background).async{
DBManager.initDBData()
DispatchQueue.main.async{
打印(“有数据”,DBManager.getBrands().count)
}
}
//写作时
func write(){
让realmBackgroud=try!Realm()
试试!realmBackgroud.write{}
}
具有运行循环的线程(如主线程)上的领域实例,这是向其线程的运行循环发布通知的结果。在后台线程上提交写事务和另一个线程的runloop收到该通知之间存在一个时间窗口,并且由于CFRunLoop
处理其相对于通知源的分派队列的顺序,写入事务提交后立即执行向主队列的异步调度
,以便在发送通知之前提供服务,这种情况并不少见
有几种方法可以解决此问题:
- 使用Realm的通知机制之一,例如收集通知,对您在后台线程上所做的更改作出反应,而不是显式地使用
dispatch\u async
- 无论线程是否有机会处理触发自动刷新的通知,都要在分派到主队列的块顶部显式调用,使其自身成为最新版本