Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在后台线程中写入域后,主线程不会';看不到更新的数据 清除数据库 进行API调用以获取新数据 将从API检索到的数据写入后台线程中的数据库 在主线程上从数据库读取数据并呈现UI_Ios_Swift_Multithreading_Realm - Fatal编程技术网

Ios 在后台线程中写入域后,主线程不会';看不到更新的数据 清除数据库 进行API调用以获取新数据 将从API检索到的数据写入后台线程中的数据库 在主线程上从数据库读取数据并呈现UI

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

在步骤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.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
  • 无论线程是否有机会处理触发自动刷新的通知,都要在分派到主队列的块顶部显式调用,使其自身成为最新版本

你在哪里调用了写函数?你救了我一天!