2016-08-23 6 views
0

Action/CocoaAction 라이브러리를 사용하려고합니다. 주된 사용법은 UIAlertController를 보여 주며 UIAlertAction 버튼을 두드리면 내 viewModel (Observable을 반환하는 changeAddress)에 정의 된 함수를 호출해야합니다.UIAlertController를 사용한 CocoaAction/Action

let ac = CocoaAction(workFactory: {[unowned self] _ in 
    self.viewModel!.requestChangeAddress() 
     .subscribeNext({ [unowned self] data in 
      if let response = data?.result 
      { 
       self.showResultOperation(response) 
      } 
     }) 
     .addDisposableTo(self.disposeBag) 
     return .empty() 
    }) 

let OKAction = UIAlertAction.Action("OK", style: .Default) 
OKAction.rx_action = ac 

그러나 불행하게도 그것은 작동하지 않습니다이의

나의 이해는 것이다. workFactory 클로저가 올바르게 호출되었지만 구독이 적용되지 않습니다. 비어있는 곳으로 돌아 왔을 때 뭔가 잘못되었다는 것을 알고 있지만 해결 방법을 이해할 수는 없습니다.

어떻게 해결할 수 있습니까? 내가 뭘 잘못하고있어?

감사합니다.

답변

0

대단한 질문입니다. 코드를 게시 해 주셔서 감사합니다.

코드에서 관찰 가능 항목을 requestChangeAddress에서 가져오고 있지만 코드를 구독하고 처분 가방에 추가하고 있습니다. Action 클래스는 실제로 당신을 위해 그것을 처리하려고합니다, 당신은 일회용을 반환해야합니다.

문제는 동작에 전송 된 값을 사용하여 작업을 수행하려는 것이고 관찰 가능을 반환해도 작업을 수행 할 수 없다는 것입니다. 따라서 관찰자 체인에 doOnNext에 대한 호출을 포함시켜야합니다. RxSwift에서 doOn 기능을 사용

let ac = CocoaAction(workFactory: {[unowned self] _ in 
    return self.viewModel! 
     .requestChangeAddress() 
     .doOnNext({ [unowned self] data in 
      if let response = data?.result 
      { 
       self.showResultOperation(response) 
      } 
     }) 
     .map { _ in Void() } 
}) 

이 여기처럼 필요할 때, 당신의 관찰 가능한에 부작용을 주입 할 수있는 좋은 방법입니다 : 여기 것처럼 보일 수 있습니다 무엇.

편집 : 공장 메서드의 반환 형식이 Observable<Void>이기 때문에 컴파일러 오류를 수정하기 위해 끝에지도를 추가했습니다.

+0

감사합니다. 첫 번째 줄에서 complier가이 오류를 제공합니다. " '(_) 유형의 값을 변환 할 수 없음 -> Observable

' '_ -> Observable <_>'" – jerrygdm

+0

Ah 유형의 예상 인수 , 권리! 내 대답을 업데이트 할게. –

+0

고마워 ... 거의 다 괜찮아. 나는 이것과 관련된 쟁점이있다 ... ok를 누르거나 alertContoller에서 취소 한 후에 버튼이 비활성화 된 것처럼 보이면, 더 이상 터치가 발사되지 않는다. 문제를 어떻게 해결할 수 있습니까? – jerrygdm