【问题标题】:Observing multiple Resources in Siesta在 Siesta 中观察多个资源
【发布时间】:2015-10-20 07:06:25
【问题描述】:

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

【问题讨论】:

    标签: json swift rest siesta-swift


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的精彩回答!我想我在这里使用第一个选项没有什么可担心的。
    • 不客气。 ResourceStatusOverlay 是初稿,没有在所有可能的情况下进行测试(但仅在使用它的地方),所以如果它不能令人满意地工作,请在 Github 上提交问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2017-06-09
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多