【问题标题】:How to use flatMapLatest on a driver with RxSwift如何在带有 RxSwift 的驱动程序上使用 flatMapLatest
【发布时间】:2019-02-09 12:38:08
【问题描述】:

每当我的用户位置发生变化时,我都会尝试从网络中获取一些数据。

struct CityService {
  private init() {}

  static let shared = CityService()

  lazy var nearbyCities: Driver<[City]> = {
    return GeolocationService.instance.location
      .flatMapLatest({ coordinate in
        let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
        return CityService.shared.fetchNearbyCitiesFor(location)
      }).asDriver(onErrorJustReturn: [])
  }()

  func fetchNearbyCitiesFor(_ location: CLLocation) -> Observable<[City]> {
    return Observable.create { observer in
      let disposable = Disposables.create()

      // Mock a fetch from the network:
      let cities = [City(name: "Amsterdam"), City(name: "Berlin")]
      observer.onNext(cities)
      observer.on(.completed)

      return disposable
    }
  }
}

class GeolocationService {
  static let instance = GeolocationService()
  private (set) var location: Driver<CLLocationCoordinate2D>
}
// from: https://github.com/ReactiveX/RxSwift/blob/master/RxExample/RxExample/Services/GeolocationService.swift

struct City {
  let name: String
}

但是,这不是编译,原因是:

Cannot convert value of type 'SharedSequence<DriverSharingStrategy, [Any]>' to specified type 'Driver<[City]>'
(aka 'SharedSequence<DriverSharingStrategy, Array<City>>')

我还尝试添加一些类型提示以获得更好的错误:

lazy var nearbyCities: Driver<[City]> = {
  return GeolocationService.shared.location
  .flatMapLatest({ coordinate -> Observable<[City]> in
    let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
    let nearbyCities: Observable<[City]> = CityService.shared.fetchNearbyCitiesFor(location)
    return nearbyCities.catch
  }).asDriver(onErrorJustReturn: [City]())
}()

但给我的只是:

Cannot convert value of type '(_) -> Observable<[City]>' to expected argument type '(CLLocationCoordinate2D) -> SharedSequence<_, _>'

我在这里做错了什么?

【问题讨论】:

    标签: swift reactive-programming rx-swift rx-cocoa


    【解决方案1】:

    您将.asDriver 呼叫置于错误的位置。

    lazy var nearbyCities: Driver<[City]> = {
        return GeolocationService.instance.location
            .flatMapLatest({ (coordinate) -> Driver<[City]> in
                let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
                return CityService.shared.fetchNearbyCitiesFor(location)
                    .asDriver(onErrorJustReturn: [])
            })
    }()
    

    【讨论】:

    • 啊!是的,最后。非常感谢。不过,我仍然无法完全理解 Drivers .. 任何与最新 RxSwift 保持同步的好资源?
    猜你喜欢
    • 1970-01-01
    • 2016-09-24
    • 2023-03-07
    • 2017-08-23
    • 2016-09-22
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多