标签: rx-swift

RxSwift - 误解了一些概念

我是RxSwift的初学者,我试着从一个简单的登录屏幕开始.所以我有2个文本字段和一个登录按钮,它绑定到一个PublishSubject所以每次点击按钮时,我都会发送网络请求来执行身份验证.

由于身份验证可能会失败,Driver因此我每次单击按钮都可以重播我的请求.

我有2个版本,我认为是相同的代码,但一个工作,一个不.我试图了解幕后发生的事情.

这是第一个有效的版本(每次触摸按钮时请求):

let credentials = Driver.combineLatest(email.asDriver(), password.asDriver()) { ($0, $1) }
self.signIn = signInTaps
    .asDriver(onErrorJustReturn: ())
    .withLatestFrom(credentials)
    .flatMapLatest { email, password in // returns Driver<Result<AuthenticateResponse, APIError>>
        return provider.request(.Authenticate(email: email, password: password))
            .filterSuccessfulStatusCodes()
            .mapObject(AuthenticateResponse)
            .map { element -> Result<AuthenticateResponse, APIError> in
                return .Success(element)
            }
            .asDriver { error in
                let e = APIError.fromError(error)
                return Driver<Result<AuthenticateResponse, APIError>>.just(.Failure(e))
            }
            .debug()
    }
Run Code Online (Sandbox Code Playgroud)

这是一个不起作用的(请求只在第一次点击时触发):

let credentials = Observable.combineLatest(email.asObservable(), password.asObservable()) { ($0, $1) }
self.signIn = signInTaps.asObservable()
    .withLatestFrom(c)
    .flatMapLatest { email, …
Run Code Online (Sandbox Code Playgroud)

ios swift rx-swift

18
推荐指数
1
解决办法
3160
查看次数

有没有办法不触发Variable <T>的初始值?

见下面的代码.

class ViewController4: UIViewController {
    var disposeBag = DisposeBag()
    let v = Variable(0)

    override func viewDidLoad() {
        super.viewDidLoad()

        v.asObservable()
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)

        v.value = 1
    }
}
Run Code Online (Sandbox Code Playgroud)

当它运行时,它将打印出来

0
1
Run Code Online (Sandbox Code Playgroud)

但是,我不希望它继续运行0,或者说0只是用于启动的值v.我能这样做吗?或者我必须在我使用它的时间点推迟代码?

rx-swift

18
推荐指数
1
解决办法
4175
查看次数

使用RxSwift观察UITextField.editing

我想观察房产UITextfield.editing.我正在使用此代码:

self.money.rx_observe(Bool.self, "editing").subscribeNext { (value) in
    print("")
}.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)

但是在运行过程中,它只执行一次.请问我该如何解决这个问题

ios swift rx-swift reactivex rx-cocoa

17
推荐指数
2
解决办法
2万
查看次数

UITextField使用RxSwift绑定到ViewModel

我愿意使用RxSwift在模型值和视图控制器之间进行MVVM绑定.我想按照这个realm.io教程,但从那时起绑定显然已经改变,示例代码不能编译.这是示例代码,我认为我已经修复了最糟糕的拼写错误/丢失的东西:

LoginViewModel.swift

import RxSwift

struct LoginViewModel {

    var username = Variable<String>("")
    var password = Variable<String>("")

    var isValid : Observable<Bool>{
        return Observable.combineLatest(self.username.asObservable(), self.password.asObservable())
        { (username, password) in
            return username.characters.count > 0
                && password.characters.count > 0
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

LoginViewController.swift

import RxSwift
import RxCocoa
import UIKit

class LoginViewController: UIViewController {
    var usernameTextField: UITextField!
    var passwordTextField: UITextField!
    var confirmButton: UIButton!

    var viewModel = LoginViewModel()

    var disposeBag = DisposeBag()

    override func viewDidLoad() {
        usernameTextField.rx.text.bindTo(viewModel.username).addTo(disposeBag)
        passwordTextField.rx.text.bindTo(viewModel.password).addTo(disposeBag)

        //from the viewModel
        viewModel.rx.isValid.map { $0 } …
Run Code Online (Sandbox Code Playgroud)

mvvm ios swift rx-swift

17
推荐指数
2
解决办法
2万
查看次数

Rxswift observable bind(to :) vs subscribe(onNext :)

抱歉.我很困惑Rxswift中的绑定是什么.据我所知,observable除非观察者订阅了它,否则不会产生价值,例如myObservable.subscribe(onNext: {}).

但是当我阅读以下代码行时:

// in LoginViewModel.swift
init() {
    isValid = Observable.combineLatest(username.asObservable(), password.asObservable()) { (username, password) in
        return !username.isEmpty && !password.isEmpty
    }
}

// in LoginViewController.swift
viewModel.isValid.bind(to: loginButton.rx.isEnabled).disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

我很困惑,为什么isValidObservable能够在不调用subscribe方法的情况下被观察到?
为什么我们可以调用bind(to :) in LoginViewController.swift而不调用类似的东西viewModel.isValid.subscribe(...)

swift rx-swift

17
推荐指数
2
解决办法
6311
查看次数

如何在rxSwift中处理"完成"返回键按下事件?

在探索RxSwift时

我发现只有textField.rx_text.asObservable()属性,每个键盘按钮被击中时触发事件.

但是我们如何处理"搜索"或"完成"按钮事件?我想在这些操作之后才进行搜索,而不是"在键入时搜索".

reactive-programming swift2 rx-swift

16
推荐指数
3
解决办法
8658
查看次数

使用retryWhen根据http错误代码更新令牌

我在如何使用moya和rxswift刷新oauth令牌时找到了这个例子,我必须稍微修改才能编译.这段代码适用于我的场景80%.它的问题是它将运行所有http错误,而不仅仅是401错误.我想要的是将我的所有其他http错误传递为错误,以便我可以处理其他地方而不是在这里吞下它们.

使用此代码,如果我得到一个HttpStatus 500,它将运行3次验证码,这显然不是我想要的.

我试图改变这个代码来处理只处理401错误,但似乎无论我做什么我都无法得到编译的代码.它总是抱怨错误的返回类型,"Cannot convert return expression of type Observable<Response> to return type Observable<Response>"这对我来说没有意义..

我想要的:处理401,但停止所有其他错误

import RxSwift
import KeychainAccess
import Moya

public extension ObservableType where E == Response {

  /// Tries to refresh auth token on 401 errors and retry the request.
  /// If the refresh fails, the signal errors.
  public func retryWithAuthIfNeeded() -> Observable<E> {
    return self.retryWhen {
      (e: Observable<ErrorType>) in
      return Observable.zip(e, Observable.range(start: 1, count: 3), resultSelector: { $1 }) …
Run Code Online (Sandbox Code Playgroud)

ios swift alamofire rx-swift moya

16
推荐指数
1
解决办法
6360
查看次数

具有多个自定义单元格类型的RxSwift表视图

我不知道有什么代码示例RxSwift可以在一个表视图中使用多个自定义单元格.例如,我有两个部分,第一部分有10个带有类型CellWithImage标识符的单元格,第二部分有10个带有类型CellWithVideo标识符的单元格.

我创建的所有tuts和代码示例都只使用一种单元格类型,例如RxSwiftTableViewExample

谢谢你的帮助

uitableview ios swift swift2 rx-swift

16
推荐指数
3
解决办法
1万
查看次数

使用RxSwift,驱动程序并绑定到

我是第一次提出问题,我正在学习RxSwift,如何使用绑定和驱动程序,驱动程序和绑定之间的区别是什么.现在学习RxSwift的其他任何人.如果你正在学习RxSwift或Swift或OC ,我希望我们能成为朋友,互相学习.

rx-swift

15
推荐指数
2
解决办法
2万
查看次数

RxSwift:如何向UILabel添加手势?

我有一个labelisUserInteractionEnabled设置为true.现在,我需要添加UITapGestureRecognizer标签.有没有办法添加Rx方式.

我在这里查看了RxSwift库.他们没有为添加手势提供任何扩展.该UILabel+Rx文件只有textattributedText.

是否有任何解决方法可以添加手势到标签?

ios swift rx-swift rx-cocoa

15
推荐指数
3
解决办法
1万
查看次数