从未调用ios swift siesta ResourceObserver resourceRequestProgress
我将午睡用于REST调用,并尝试创建一个简单的ResourceObserver来显示SVProgressHUD从未调用ios swift siesta ResourceObserver resourceRequestProgress,ios,swift,siesta-swift,Ios,Swift,Siesta Swift,我将午睡用于REST调用,并尝试创建一个简单的ResourceObserver来显示SVProgressHUD open class SVProgressHUDResourceObserver: ResourceObserver { static let sharedInstance = SVProgressHUDResourceObserver() // Show/Hide SVProgressHUD public func resourceRequestProgre
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)
}
}
我特意为登录添加了10秒延迟,但是SVProgressHUD从未显示,事实上resourceRequestProgress方法从未被调用。认证过程非常有效
日志输出为:
SVProgressHUDResourceObserver resourceChanged event=observerAdded
SVProgressHUDResourceObserver resourceChanged event=newData(wipe)
我们非常感谢您对这项工作的任何帮助。午睡有以下不同:
在此代码中,您将附加
SVProgressHUDResourceObserver.sharedInstance
作为资源本身的观察者:
return service.resource("/app/v1/authentication/login")
.addObserver(SVProgressHUDResourceObserver.sharedInstance)
…这意味着它只会收到load()
请求的通知。但是你永远不会加载它;您只需请求
它:
.request(.post, json: [
"username": username,
"password": password
])
…这意味着只有附加到该特定请求的请求挂钩(onSuccess
,onFailure
)才会被通知该请求已完成
如果您只需要一个进度条,请放弃
ResourceObserver
,改用请求挂钩
(如果您需要保存登录结果,则《用户指南》将介绍如何更新资源的状态以响应post请求。但是,您似乎已经通过其他方式存储了身份验证凭据,这是一种典型的好方法。)感谢您花时间提供了一个极好的答案。这非常有帮助。