gpt4 book ai didi

ios swift siesta ResourceObserver resourceRequestProgress 从未调用过

转载 作者:搜寻专家 更新时间:2023-11-01 07:03:31 25 4
gpt4 key购买 nike

我正在使用 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. 整个资源本身的状态,Siesta 将其缓存并保留以供任何人观察,以及
  2. 与资源相关的单个请求的结果,Siesta 将其发送到请求 Hook ,但在请求被解除分配后最终将被丢弃。

请注意,对于#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 (onSuccessonFailure)才会收到完成通知.


如果你只需要一个进度条,放弃 ResourceObserver 并使用 onProgress而是请求的钩子(Hook)。

(如果您需要保存登录结果,那么用户指南列出了如何更新资源的状态以响应发布请求。但是,看起来您已经通过其他方式存储了身份验证凭据,这是一个典型的好方法。)

关于ios swift siesta ResourceObserver resourceRequestProgress 从未调用过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49620486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com