将UITableview与订阅数据同步

时间:2019-05-23 13:55:37

标签: swift uitableview concurrency grand-central-dispatch

我有一个带有一些复杂操作的Tableview,其中 通过GraphQl订阅实时插入和更新节。 目前,我在比赛条件方面遇到一些问题。 当我通过订阅收到新数据时,我将其解析为Model并使用插入内容更新tableview并更新某些现有单元格的内容和大小。 当我更快地获取数据时,问题就来了,然后我可以完成表中的先前更新,导致“无效的节数”崩溃。 我相信一个解决方案是串行/等待序列订阅->模型-> tableview。 香港专业教育学院试图使它与各种并发方法,如信号量,同步,障碍,调度组。但无法成功解决。 如果我尝试简化,事件的顺序会像这样发生。 //模型 订阅{  //在表中绘制以前的数据之前,不应开始解析新数据,以避免模型和表不匹配  解析(数据) } func parse(data){ //做类似更新数据模型的工作 figOutWhatToUpdateInTable(data){(insertSet,reloadSet)在   proxy.updateTableView(插入集,重新加载集)  } //做东西 } // VC func updateTableView(insertSet,reloadSet){  tableView.beginUpdates()  CATransaction.begin() //一旦插入新的部分,我们需要更新某些部分的内容  CATransaction.setCompletionBlock {   reloadSet.forEach {(index:Int)in    让section = tableView.headerView(forSection:index)     section.updateData(data [index]){  //调用begin / end以使tableview变高      tableView.beginUpdates()      tableView.endUpdates() //现在我准备将新数据解析到我的模型中       }    })  } tableView.insertSections(insetSet,with:.top) CATransaction.commit() tableView.endUpdates() } 基本上我需要等待section.updateData完成,然后parse(data)处理订阅中的任何新数据

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可以使用DispatchGroup

    let group = DispatchGroup()
    group.enter()

    // do some stuff (1)

    group.leave()

    group.notify(queue: .main) {
        // do stuff after 1
    }

调用group.leave()组后,自动在group.notify块执行STUFF