- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 Siesta 进行 REST 调用,我正在尝试创建一个简单的 ResourceObserver 来显示 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)
}
}
我故意为登录添加了 10 秒的延迟,但是 SVProgressHUD 从未显示,实际上 resourceRequestProgress 方法从未被调用。身份验证过程非常有效。
日志输出为:
SVProgressHUDResourceObserver resourceChanged event=observerAdded
SVProgressHUDResourceObserver resourceChanged event=newData(wipe)
如能提供任何帮助,我们将不胜感激。
最佳答案
午睡有区别:
请注意,对于#1,如果任何人更新了资源的状态,观察者会不断收到通知,而对于#2,只有专门为该请求注册的 Hook 才会收到通知。
这两个携带不同类型的信息。 #1 用于更新资源状态的持续共享真相(“当前用户的配置文件”),而 #2 用于更新资源上特定操作的状态(“更改用户的密码”)。
花点时间消化“Request vs. Load ”在用户指南中。然后,一旦您理解了这一点,请继续阅读。
在此代码中,您将附加 SVProgressHUDResourceObserver.sharedInstance
作为资源本身的观察者:
return service.resource("/app/v1/authentication/login")
.addObserver(SVProgressHUDResourceObserver.sharedInstance)
…这意味着它只会收到 load()
请求的通知。但是您永远不会加载
它;你只需请求
它:
.request(.post, json: [
"username": username,
"password": password
])
…这意味着只有您附加到该特定请求的请求 Hook (onSuccess
、onFailure
)才会收到完成通知.
如果你只需要一个进度条,放弃 ResourceObserver
并使用 onProgress
而是请求的钩子(Hook)。
(如果您需要保存登录结果,那么用户指南列出了如何更新资源的状态以响应发布请求。但是,看起来您已经通过其他方式存储了身份验证凭据,这是一个典型的好方法。)
关于ios swift siesta ResourceObserver resourceRequestProgress 从未调用过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49620486/
我正在使用 Siesta 进行 REST 调用,我正在尝试创建一个简单的 ResourceObserver 来显示 SVProgressHUD。 open class SVProgressHUDRes
我是一名优秀的程序员,十分优秀!