ios swift siesta ResourceObserver resourceRequestProgress никогда не вызывается

Я использую 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 ответ

Решение

В Сиесте есть разница между:

  1. состояние всего ресурса, который Сиеста кэширует и хранит, чтобы его мог наблюдать каждый, и
  2. результаты отдельных запросов, относящихся к ресурсу, которые Сиеста отправляет для перехвата запросов, но в конечном итоге отбрасывает их после освобождения запроса.

Обратите внимание, что с #1 наблюдатели продолжают получать уведомления, если кто-либо обновляет состояние ресурса, тогда как с #2 только уведомления, специально зарегистрированные для этого запроса, получают уведомления.

Эти два несут различную информацию. № 1 - для обновления текущей общей правды о состоянии ресурса ("профиль текущего пользователя"), тогда как № 2 - для обновления о состоянии определенного действия над ресурсом ("изменение пароля пользователя").

Потратьте некоторое время, чтобы переварить " Запрос против загрузки " в руководстве пользователя. Затем, как только вы поняли это, продолжайте читать.


В этом коде вы прикрепляете SVProgressHUDResourceObserver.sharedInstance в качестве наблюдателя самого ресурса:

    return service.resource("/app/v1/authentication/login")
        .addObserver(SVProgressHUDResourceObserver.sharedInstance)

… Что означает, что он будет получать только уведомления load() Запросы. Но ты никогда load Это; только ты request Это:

        .request(.post, json: [
            "username": username,
            "password": password
            ])

… Что означает, что только запрос перехватывает (onSuccess, onFailure), что вы приложите к этому конкретному запросу, будет уведомлено, что оно выполнено.


Если вам нужен только индикатор прогресса, угробите ResourceObserver и использовать onProgress хук запроса вместо этого.

(Если вам нужно сохранить результат входа в систему, то в руководстве пользователя изложено, как обновить состояние ресурса в ответ на запрос публикации. Однако похоже, что вы уже сохраняете учетные данные аутентификации с помощью других средств, что является Типичный и прекрасный подход.)

Другие вопросы по тегам