Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 午睡时观察多种资源_Json_Swift_Rest_Siesta Swift - Fatal编程技术网

Json 午睡时观察多种资源

Json 午睡时观察多种资源,json,swift,rest,siesta-swift,Json,Swift,Rest,Siesta Swift,在我的类中,我有多个Resource Siesta对象,我希望在填充表视图和启用用户输入之前加载所有这些对象 代码如下: var trainees: Resource? { didSet { oldValue?.removeObservers(ownedBy: self) trainees?.addObserver(self).addObserver(statusOverlay, owner: self).loadIfNeeded() } }

在我的类中,我有多个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

如果您正在使用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上提交问题。