从未调用ios swift siesta ResourceObserver resourceRequestProgress

从未调用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

我将午睡用于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)

我们非常感谢您对这项工作的任何帮助。

午睡有以下不同:

  • 整个资源本身的状态,午睡会将其隐藏起来,并保留下来供任何人观察,以及
  • 与资源相关的单个请求的结果,Siesta将其发送到请求挂钩,但一旦请求被解除分配,最终将丢弃
  • 请注意,使用#1,如果有人更新资源的状态,观察者将不断收到通知,而使用#2,只有专门为该请求注册的钩子才能收到通知

    这两者携带不同种类的信息#1用于更新资源状态的持续共享真相(“当前用户的配置文件”),而2用于更新资源上特定操作的状态(“更改用户密码”)

    花一些时间来消化《用户指南》中的“”。然后,一旦你明白了,继续读下去


    在此代码中,您将附加
    SVProgressHUDResourceObserver.sharedInstance
    作为资源本身的观察者:

        return service.resource("/app/v1/authentication/login")
            .addObserver(SVProgressHUDResourceObserver.sharedInstance)
    
    …这意味着它只会收到
    load()
    请求的通知。但是你永远不会加载它;您只需
    请求
    它:

            .request(.post, json: [
                "username": username,
                "password": password
                ])
    
    …这意味着只有附加到该特定请求的请求挂钩(
    onSuccess
    onFailure
    )才会被通知该请求已完成


    如果您只需要一个进度条,请放弃
    ResourceObserver
    ,改用请求挂钩


    (如果您需要保存登录结果,则《用户指南》将介绍如何更新资源的状态以响应post请求。但是,您似乎已经通过其他方式存储了身份验证凭据,这是一种典型的好方法。)

    感谢您花时间提供了一个极好的答案。这非常有帮助。