在 Siesta 中观察多个资源
Observing multiple Resources in Siesta
在我的 class 中,我有多个 Resource Siesta 对象,我希望在填充 table 视图并启用用户输入之前将其全部加载数据。
代码如下:
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
如果您使用的是 Siesta 的内置 ResourceStatusOverlay
,并且如果相同的状态叠加层正在观察所有三个资源,那么在所有三个资源都加载之前,叠加层不会消失。一种选择是让叠加层在加载时覆盖所有内容,即使 table 视图部分填充在下方也是如此。
选项 2
如果您的逻辑中断,除非所有数据都存在,您可以在触摸 table 视图之前检查所有三个资源是否都有数据:
func resourceChanged(resource: Siesta.Resource, event: Siesta.ResourceEvent) {
if trainees.latestData != nil && points.latestData != nil && exercises.latestData != nil {
tableView.reloadData()
}
}
请注意,即使在 resource.wipe()
调用之后,这样做也会使 table 视图填充。如果您使用 service.wipeResources()
将用户注销,那么这可能会导致即使在注销后用户数据仍保留在屏幕上。解决方案是用所有数据或 none 填充一些数据结构,但在任何一种情况下都调用 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
确保您的逻辑处理有或没有数据的资源,并随着资源的填充逐渐填充 table 视图:
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()
}
由于 table 视图中的惰性单元格创建,这种方法很少会引起性能问题。
在我的 class 中,我有多个 Resource Siesta 对象,我希望在填充 table 视图并启用用户输入之前将其全部加载数据。
代码如下:
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
如果您使用的是 Siesta 的内置 ResourceStatusOverlay
,并且如果相同的状态叠加层正在观察所有三个资源,那么在所有三个资源都加载之前,叠加层不会消失。一种选择是让叠加层在加载时覆盖所有内容,即使 table 视图部分填充在下方也是如此。
选项 2
如果您的逻辑中断,除非所有数据都存在,您可以在触摸 table 视图之前检查所有三个资源是否都有数据:
func resourceChanged(resource: Siesta.Resource, event: Siesta.ResourceEvent) {
if trainees.latestData != nil && points.latestData != nil && exercises.latestData != nil {
tableView.reloadData()
}
}
请注意,即使在 resource.wipe()
调用之后,这样做也会使 table 视图填充。如果您使用 service.wipeResources()
将用户注销,那么这可能会导致即使在注销后用户数据仍保留在屏幕上。解决方案是用所有数据或 none 填充一些数据结构,但在任何一种情况下都调用 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
确保您的逻辑处理有或没有数据的资源,并随着资源的填充逐渐填充 table 视图:
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()
}
由于 table 视图中的惰性单元格创建,这种方法很少会引起性能问题。