我是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) 见下面的代码.
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.我能这样做吗?或者我必须在我使用它的时间点推迟代码?
我想观察房产UITextfield.editing.我正在使用此代码:
self.money.rx_observe(Bool.self, "editing").subscribeNext { (value) in
print("")
}.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
但是在运行过程中,它只执行一次.请问我该如何解决这个问题
我愿意使用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) 抱歉.我很困惑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(...)
在探索RxSwift时
我发现只有textField.rx_text.asObservable()属性,每个键盘按钮被击中时触发事件.
但是我们如何处理"搜索"或"完成"按钮事件?我想在这些操作之后才进行搜索,而不是"在键入时搜索".
我在如何使用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) 我不知道有什么代码示例RxSwift可以在一个表视图中使用多个自定义单元格.例如,我有两个部分,第一部分有10个带有类型CellWithImage标识符的单元格,第二部分有10个带有类型CellWithVideo标识符的单元格.
我创建的所有tuts和代码示例都只使用一种单元格类型,例如RxSwiftTableViewExample
谢谢你的帮助
我是第一次提出问题,我正在学习RxSwift,如何使用绑定和驱动程序,驱动程序和绑定之间的区别是什么.现在学习RxSwift的其他任何人.如果你正在学习RxSwift或Swift或OC ,我希望我们能成为朋友,互相学习.
我有一个label与isUserInteractionEnabled设置为true.现在,我需要添加UITapGestureRecognizer标签.有没有办法添加Rx方式.
我在这里查看了RxSwift库.他们没有为添加手势提供任何扩展.该UILabel+Rx文件只有text和attributedText.
是否有任何解决方法可以添加手势到标签?