9

私はこのカスタム実装を持っていますAlamofire:

protocol HTTPProtocol: class {
    typealias RequestType
    typealias RespondType
    func doRequest(requestData: RequestType) -> Self
    func completionHandler(block:(Result<RespondType, NSError>) -> Void) -> Self
}

//example of a request:
locationInfo
      //Make a request
    .doRequest(HTTPLocationInfo.RequestType(coordinate: $0))

      //Call back when request finished
    .completionHandler { result in
        switch result {
            case .Success(let info): self.locationInfoRequestSuccess(info)
            case .Failure(let error): self.locationInfoRequestFailed(error)
        }               
    }

プロジェクトに MVVM と RxSwift を適用したいと考えています。ただし、これを行う適切な方法が見つかりません。

私が達成したいのは、次のことができるaViewModelと aです。ViewController

class ViewController {
    func googleMapDelegate(mapMoveToCoordinate: CLLocationCoordinate2D) {
        // Step 1: set new value on `viewModel.newCoordinate` and make a request
    }

    func handleViewModelCallBack(resultParam: ...*something*) {
        // Step 3: subscribeOn `viewModel.locationInfoResult` and do things.
    }
}

class ViewModel {
    //Result if a wrapper object of Alamofire.
    typealias LocationInfoResult = (Result<LocationInfo.Respond, NSError>) -> Void
    let newCoordinate = Variable<CLLocationCoordinate2D>(kInvalidCoordinate)
    let locationInfoResult: Observable<LocationInfoResult>

    init() {
        // Step 2: on newCoordinate change, from step 1, request Location Info
        // I could not find a solution at this step
        // how to make a `completionHandler` set its result on `locationInfoResult`
    }
}

どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

0

購読する必要はないようですnewCoordinateので、それをリクエストしfuncます。

次に、Alamofire から返された情報を使用して、に値を設定するだけでlocationInfoResult、新しい結果がViewController

class ViewController: UIViewController {
    func viewDidLoad() {
        super.viewDidLoad()

        //subscribe to info changes
        viewModel.locationInfoResult
            .subscribeNext { info in 
                //do something with info...
            }
    }

    func googleMapDelegate(mapMoveToCoordinate: CLLocationCoordinate2D) {
        viewModel.requestLocationInfo(mapMoveToCoordinate)
    }
}

class ViewModel {
    let locationInfoResult: Variable<LocationInfoResult?>(nil)

    init() {
    }

    func requestLocationInfo(location: CLLocationCoordinate2D) {
        //do Alamofire stuff to get info

        //update with the result
        locationInfoResult.value = //value from Alamofire
    }
}
于 2015-12-29T17:07:00.010 に答える