Как синхронизировать или сделать наблюдаемое ожидание на Swift? - PullRequest
0 голосов
/ 15 января 2019

Итак, у меня есть эта функция входа в систему, где я хочу вернуть логическое значение моему контроллеру .xib, где он должен внести некоторые изменения в зависимости от успешности входа в систему.

 func login(cpf: String) -> Bool {
    let url = URL(string: AccessibilityDataAccessProvider.kLoginURL)
    let params = ["username": String.init(describing: cpf)]

    var success = false

    dataAccessProvider.postSimpleResponse(url: url!, params: params)
        .subscribe(onNext: { (userToken) in
            let userData = UserDefaults.standard
            userData.set(userToken, forKey: AccessibilityDataAccessProvider.userTokenKey)
            userData.synchronize()
            success = true
    }, onError: { (error) in
        print("Login Error: \(error)")
    }).disposed(by: disposeBag)

    return success
}

Возврат из postSimpleResponse () - это Наблюдаемый типа Любой? .

Дело в том, что мой метод login () возвращается до того, как логическая переменная success будет установлена ​​в true в подписке.

Как я могу решить это?

1 Ответ

0 голосов
/ 16 января 2019

Вы можете сопоставить Observable с Bool observable (хотя Bool здесь не требуется, вы можете просто использовать Void) и вернуть Observable из login метода.

Как это:

func login(cpf: String) -> Observable<Bool> {
    let url = URL(string: AccessibilityDataAccessProvider.kLoginURL)
    let params = ["username": String.init(describing: cpf)]

    return dataAccessProvider.postSimpleResponse(url: url!, params: params)
        .do(onNext: {
            let userData = UserDefaults.standard
            userData.set(userToken, forKey: AccessibilityDataAccessProvider.userTokenKey)
        })
        .map { _ in
            return true
    }
}

А потом понаблюдайте на нем:

login(cpf: "data").subscribe(onNext: { _ in
    // Success
}, onError: { _ in
    // Failure
}).disposed(by: disposeBag)
...