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 - для обновления о состоянии определенного действия над ресурсом ("изменение пароля пользователя").
Потратьте некоторое время, чтобы переварить " Запрос против загрузки " в руководстве пользователя. Затем, как только вы поняли это, продолжайте читать.
В этом коде вы прикрепляете 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
хук запроса вместо этого.
(Если вам нужно сохранить результат входа в систему, то в руководстве пользователя изложено, как обновить состояние ресурса в ответ на запрос публикации. Однако похоже, что вы уже сохраняете учетные данные аутентификации с помощью других средств, что является Типичный и прекрасный подход.)