2

在我的班级中,我有多个 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 func中调用reloadData之前检查所有内容是否已加载的最佳方法是什么。谢谢。

4

1 回答 1

0

选项1

如果您使用的是 Siesta 的内置ResourceStatusOverlay,并且如果相同的状态叠加层正在观察所有三个资源,那么在所有三个都加载完之前叠加层不会消失。一种选择是让覆盖层在加载时覆盖所有内容,即使 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()
}

由于表格视图中的单元格创建延迟,这种方法很少会引起性能问题。

于 2015-10-20T15:01:02.317 回答