RxSwift和三个API请求

问题描述

我想从三个不同的API中获取数据,然后将其保存在数据库中。因此,操作后应将每个查询的数据分开。 如何用RxSwift做到这一点?压缩?在我的示例中,我仅使用两个URL,但这只是示例。

QueryService:

import Foundation
import RxSwift

class QueryService {

    let albumsURL = URL(string: "https://jsonplaceholder.typicode.com/albums")!


    func fetchAlbums() -> Observable<[Album]> {
        
        return Observable.create { observer -> disposable in
            
            let task = URLSession.shared.dataTask(with: self.albumsURL) { data,_,_ in
        
                guard let data = data else {
                    observer.onError(NSError(domain: "",code: -1,userInfo: nil))
                    return
                }
        
                do {
                    let albums = try JSONDecoder().decode([Album].self,from: data)
                    observer.onNext(albums)
                } catch {
                    observer.onError(error)
                }
            }
            task.resume()
            return disposables.create{
                task.cancel()
            }
        }
    }

    func fetchUsers() -> Observable<[User]> {
        
        return Observable.create { observer -> disposable in
            
            let task = URLSession.shared.dataTask(with: URL(string: "https://jsonplaceholder.typicode.com/users")!) { data,userInfo: nil))
                    return
                }
                
                do {
                    let users = try JSONDecoder().decode([User].self,from: data)
                    observer.onNext(users)
                } catch {
                    observer.onError(error)
                }
            }
            task.resume()
            return disposables.create{
                task.cancel()
            }
        }
    }


}

解决方法

我假设您正在尝试并行执行两个任务,并且希望通过一个可观察的对象来达到它们的结果。

在这种情况下,您的代码应如下所示:

Observable.zip(service.fetchAlbums(),service.fetchUsers())
    .subscribe(onNext: { (albums,users) in
        print(albums)
        print(users)
    })
    .disposed(by: self.disposeBag)