如何使用线程安全同步数据源更新与tableview重新加载?

时间:2017-02-22 14:52:40

标签: ios swift multithreading grand-central-dispatch

我经常更新tableview数据源,需要正确地同步tableview更新和数据源更新。你能否在Swift 3中建议正确的方法?

ListViewModel

/// Main list viewmodel refreshing and filtering API
private func refreshCards(withIcon icon: CardIcon) {

    queue.async {

        Log.debug("refresh cards Started")

        switch icon {

        case .all:

            self.loadOpenCards()
            self.loadCompletedCards()

        default:

            self.filterOpenCards(byIcon: icon)
            self.filterCompletedCards(byIcon: icon)
        }

        // Ask list TVC to reload table
        self.listTVC?.refreshForUpdates()

        Log.debug("refresh cards Finished")
    }
}

ListTableViewController

func refreshForUpdates() {

    DispatchQueue.main.async {

        self.updateApprovalListBackgroundGraphics()

        self.tableView.reloadData()

        Log.debug("refresh cards Reloaded")
    }
}

在此代码中,tableView.reloadData()不等待viewmodel刷新,因为它在主线程上被调度async。

1 个答案:

答案 0 :(得分:2)

我在这种情况下采用的一般方法是确保视图控制器具有数据的静态副本,以便在后台不会更改任何内容。

您拥有数据模型的主实例。此数据模型处理异步更新。它需要做的是通知其监听器(例如视图控制器)它已被更新。监听器应通过保存数据模型的副本然后刷新其视图(例如重新加载表视图)来响应此更新。

如果主数据模型碰巧在视图控制器自身更新时发布了另一个更新,那么它不是问题,因为视图控制器不会处理下一次更新,直到它从上一次更新完成更新并且视图控制器的数据副本尚未随新更新而改变。