在Siesta中观察多个资源

时间:2015-10-20 07:06:26

标签: json swift rest siesta-swift

在我的课程中,我有多个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之前检查所有内容是否已被加载的最佳方法是什么。感谢。

1 个答案:

答案 0 :(得分:0)

选项1

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

选项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()
}

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