[swift]观察在午睡的多个资源

标签: REST json Swift
发布时间: 2017/3/5 14:32:51
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

在我的课我有我想要所有的对象加载数据然后填充表视图使用户输入的多个资源午睡。

下面是代码︰

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:

选项 1

如果您使用的午睡的内置 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()
}

由于懒惰的单元格创建表格视图中,这种做法很少是一个性能问题。

官方微信
官方QQ群
31647020