在午休中观察多个资源



在我的类中,我有多个Resource Siesta对象,我希望在填充表视图和启用用户输入之前加载所有数据。

代码如下:

var trainees: Resource? {
    didSet {
        oldValue?.removeObservers(ownedBy: self)
        trainees?.addObserver(self).addObserver(statusOverlay, owner: self).loadIfNeeded()
    }
}
var points: Resource? {
    didSet {
        oldValue?.removeObservers(ownedBy: self)
        points?.addObserver(self).addObserver(statusOverlay, owner: self).loadIfNeeded()
    }
}
var exercises: Resource? {
    didSet {
        oldValue?.removeObservers(ownedBy: self)
        exercises?.addObserver(self).addObserver(statusOverlay, owner: self).loadIfNeeded()
    }
}
func resourceChanged(resource: Siesta.Resource, event: Siesta.ResourceEvent) {
    tableView.reloadData()
}
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.trainees = DataManager.sharedInstance.api.trainees
    self.points = DataManager.sharedInstance.api.points
    self.exercises = DataManager.sharedInstance.api.exercises
}

所以问题是,在调用resourceChanged函数中的reloadData之前,检查所有内容是否已加载的最佳方法是什么?谢谢。

选项1

如果您正在使用Siesta的内置ResourceStatusOverlay,并且如果相同的状态覆盖正在观察所有三个资源,那么覆盖将不会消失,直到所有三个资源都被加载。一种选择是在加载时让overlay覆盖所有内容,即使tableview在下面被部分填充。

选项2

如果逻辑中断,除非所有数据都存在,您可以在触摸表视图之前检查所有三个资源是否都有数据:

func resourceChanged(resource: Siesta.Resource, event: Siesta.ResourceEvent) {
    if trainees.latestData != nil && points.latestData != nil && exercises.latestData != nil {
        tableView.reloadData()
    }
}

注意,这样做即使在resource.wipe()调用之后也会使表视图填充。如果您正在使用service.wipeResources()注销用户,那么这可能导致用户数据在注销后仍保留在屏幕上。解决方案是用所有数据或没有数据填充一些数据结构,但是在这两种情况下都调用reloadData():

func resourceChanged(resource: Siesta.Resource, event: Siesta.ResourceEvent) {
    if trainees.latestData != nil && points.latestData != nil && exercises.latestData != nil {
        dataToDisplayInTable = .......;
    } else {
        dataToDisplayInTable = [];
    }
    tableView.reloadData()
}

选项3

确保您的逻辑处理有或没有数据的资源,并随着资源的填充而增量地填充表视图:

func resourceChanged(resource: Siesta.Resource, event: Siesta.ResourceEvent) {
    // This is made-up logic; insert your real logic here.
    // Note that this example works because jsonArray returns []
    // for a resource with no data.
    dataToDisplayInTable = trainees.jsonArray
                         + points.jsonArray
                         + exercises.jsonArray
    tableView.reloadData()
}

由于在表视图中延迟创建单元格,因此这种方法很少涉及性能问题。

相关内容

  • 没有找到相关文章

最新更新