我正在使用 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)
任何有关使其工作的帮助将不胜感激。