我正在使用siesta进行休息呼叫,我正在尝试创建一个简单的资源浏览器来显示Svprogresshud。
open class SVProgressHUDResourceObserver: ResourceObserver {
static let sharedInstance = SVProgressHUDResourceObserver()
// Show/Hide SVProgressHUD
public func resourceRequestProgress(for resource: Resource, progress: Double) {
print("SVProgressHUDResourceObserver resourceRequestProgress - progress=(progress)")
if progress == 1 {
print("SVProgressHUD.dismiss()")
SVProgressHUD.dismiss()
} else if !SVProgressHUD.isVisible() {
print("show()")
SVProgressHUD.show()
}
}
public func resourceChanged(_ resource: Resource, event: ResourceEvent) {
print("SVProgressHUDResourceObserver resourceChanged event=(event)")
}
}
由于它是单身人士,所以我使用弱参考添加观察者:
@discardableResult func login(_ username: String, _ password: String,
onSuccess: @escaping (LoginResponse) -> Void,
onFailure: @escaping (Int?, String) -> Void) -> Request {
return service.resource("/app/v1/authentication/login")
.addObserver(SVProgressHUDResourceObserver.sharedInstance)
.request(.post, json: [
"username": username,
"password": password
])
.onSuccess { entity in
guard let loginResponse: LoginResponse = entity.typedContent() else {
onFailure(0, "JSON parsing error")
return
}
self.authToken = loginResponse.session.token
SessionManager.beginNewSession(loginResponse)
onSuccess(loginResponse)
}
.onFailure { (error) in
onFailure(error.httpStatusCode, error.userMessage)
}
}
i故意向登录中添加了10秒的延迟,但是Svprogresshud从未显示,事实上,ResourceRecerQuestProgress方法从未被调用。身份验证过程效果很好。
日志输出是:
SVProgressHUDResourceObserver resourceChanged event=observerAdded
SVProgressHUDResourceObserver resourceChanged event=newData(wipe)
将其上班的任何帮助都将不胜感激。
:
之间的午睡有所不同- 整个资源本身的状态 ,塞斯塔在塞斯塔(Siesta
- 与资源有关的单个请求的结果,Siesta发送给请求挂钩,但最终丢弃了请求。
请注意,如果任何人更新资源的状态,观察者将继续获得通知,而仅使用#2使用#2的挂钩,则专门为该请求注册了通知。
。这两个带有不同种类的信息。#1是为了更新资源状态的正在进行的共享真理("当前用户的配置文件"(,而#2则用于对资源上特定 Action 的状态进行更新("更改"用户的密码"(。
在用户指南中花费一些时间来消化"请求与加载"。然后,一旦您了解了这一点,请继续阅读。
在此代码中,您将SVProgressHUDResourceObserver.sharedInstance
作为资源本身的观察者附加:
return service.resource("/app/v1/authentication/login")
.addObserver(SVProgressHUDResourceObserver.sharedInstance)
…这意味着它将仅收到load()
请求的通知。但是您永远不会load
;您仅request
IT:
.request(.post, json: [
"username": username,
"password": password
])
…这意味着您将特定请求附加到上的请求挂钩( onSuccess
, onFailure
(。
如果您只需要一个进度栏,请ditch ResourceObserver
并使用请求的 onProgress
钩子。
(如果您需要保存登录的结果,则用户指南列出了如何根据POST请求更新资源的状态。但是,看起来您已经通过其他方式来存储Auth corpers,这是一种典型而又很好的方法。(