运行 一次请求多个,一旦成功就继续
Run multiple request at a time and continue as soon there is success
给定一个 url 的数组,有没有办法同时 运行 这些?但是以这种方式,一旦有一个成功就使用那个成功的 url.
移动到下一个请求
到目前为止,我尝试链接 concatMap
,但失败了 zip
。
func updateAccountInfo() -> Single<Bool> {
var disposable: Disposable? = nil
return Single<Bool>.create { observer in
do {
var urls = try self.settings.domains.value()
disposable = Observable.from(urls)
.enumerated()
.concatMap { index, url -> Single<URL> in
return self.verifyUrl(url)
}
.concatMap { url -> Single<Account> in
return self.apiManager.loadAccountInfo(from: url)
}
.observeOn(MainScheduler.instance)
.do(onNext: { (account: AccountInfo) in
// use account unfo here
disposable!.dispose()
})
.subscribe()
} catch {
observer(.error(error))
}
return Disposables.create()
}
}
也试过:
disposable = Observable.from(urls)
.enumerated()
.concatMap { index, url -> Single<(Bool, URL)> in
return self.verifyUrl(url)
}
.subscribe(onNext: { reachable, url in
if reachable {
self.apiManager.loadAccountInfo(from: url)
.subscribe(onSuccess: { accountInfo in
// use account info here
}, onError: { error in
})
.disposed(by: self.bag)
disposable!.dispose()
} else {
}
}, onError: { error in
}, onCompleted: {
})
也许我使用 zip,但我如何创建一个 verifyUrl(url)
调用数组? zip
是否完全接受 Observable
的数组?
let obs = Observable.from(urls)
.enumerated()
.concatMap { index, url -> Single<URL> in
return self.verifyUrl(url)
}
let test = Observable
.zip(obs).map { [urls] in
return [urls]
}
如果我对问题的理解正确,你正在寻找这样的东西:
func example() throws {
let urls = try self.settings.domains.value()
Observable.merge(urls.map { verifyUrl([=10=]).asObservable() })
.flatMap { [apiManager] url in
apiManager!.loadAccountInfo(from: url)
}
.observe(on: MainScheduler.instance)
.subscribe(onNext: { account in
// use account unfo here
})
.disposed(by: self.disposeBag)
}
但这很难说。您的代码示例有点混乱。将所有代码放在 Single.create 中很奇怪。当你有一次性 return 时从闭包返回 Disposables.create() 是奇怪的。在 do 块内的一次性调用 dispose() 是奇怪的。太奇怪了...我建议你 post https://codereview.stackexchange.com 上的一些代码或查看示例代码。
给定一个 url 的数组,有没有办法同时 运行 这些?但是以这种方式,一旦有一个成功就使用那个成功的 url.
移动到下一个请求到目前为止,我尝试链接 concatMap
,但失败了 zip
。
func updateAccountInfo() -> Single<Bool> {
var disposable: Disposable? = nil
return Single<Bool>.create { observer in
do {
var urls = try self.settings.domains.value()
disposable = Observable.from(urls)
.enumerated()
.concatMap { index, url -> Single<URL> in
return self.verifyUrl(url)
}
.concatMap { url -> Single<Account> in
return self.apiManager.loadAccountInfo(from: url)
}
.observeOn(MainScheduler.instance)
.do(onNext: { (account: AccountInfo) in
// use account unfo here
disposable!.dispose()
})
.subscribe()
} catch {
observer(.error(error))
}
return Disposables.create()
}
}
也试过:
disposable = Observable.from(urls)
.enumerated()
.concatMap { index, url -> Single<(Bool, URL)> in
return self.verifyUrl(url)
}
.subscribe(onNext: { reachable, url in
if reachable {
self.apiManager.loadAccountInfo(from: url)
.subscribe(onSuccess: { accountInfo in
// use account info here
}, onError: { error in
})
.disposed(by: self.bag)
disposable!.dispose()
} else {
}
}, onError: { error in
}, onCompleted: {
})
也许我使用 zip,但我如何创建一个 verifyUrl(url)
调用数组? zip
是否完全接受 Observable
的数组?
let obs = Observable.from(urls)
.enumerated()
.concatMap { index, url -> Single<URL> in
return self.verifyUrl(url)
}
let test = Observable
.zip(obs).map { [urls] in
return [urls]
}
如果我对问题的理解正确,你正在寻找这样的东西:
func example() throws {
let urls = try self.settings.domains.value()
Observable.merge(urls.map { verifyUrl([=10=]).asObservable() })
.flatMap { [apiManager] url in
apiManager!.loadAccountInfo(from: url)
}
.observe(on: MainScheduler.instance)
.subscribe(onNext: { account in
// use account unfo here
})
.disposed(by: self.disposeBag)
}
但这很难说。您的代码示例有点混乱。将所有代码放在 Single.create 中很奇怪。当你有一次性 return 时从闭包返回 Disposables.create() 是奇怪的。在 do 块内的一次性调用 dispose() 是奇怪的。太奇怪了...我建议你 post https://codereview.stackexchange.com 上的一些代码或查看示例代码。