我是RxSwift的新手,需要一个非常基本的帮助.
假设我有一个Observable并按这样订阅它.
let source: Observable<Void> = Observable.create { [weak self] observer in
guard let _ = self else {
observer.on(.Completed)
return NopDisposable.instance
}
observer.on(.Next())
return AnonymousDisposable {
}
}
Run Code Online (Sandbox Code Playgroud)
订阅如下:
source.subscribeNext { () -> Void in
}
Run Code Online (Sandbox Code Playgroud)
问题是:如何在每次需要时手动将事件发送到subscribeNext.这就像rx_tap行为一样UIButton.
我在示例中看到代码有这样的东西source = button.rx_tap.asObservale().之后,每次用户点击按钮时,都会在subscribeNext()上发出一个事件并触发.我也希望这种行为,但在程序上,而不是从UI事件.
我应该如何Observable在RxSwift中合并两种不同类型的s?
例如:
var a: Observable<Int>
var b: Observable<Void>
Run Code Online (Sandbox Code Playgroud)
Observable.of(a,b).merge() 因类型参数不同而无法实现.
我正在尝试使用RxSwift重现一个简单的计时器.
我有一个暂停/播放按钮,只适用于暂停和恢复.
gameTimer = Observable<NSInteger>.interval(1, scheduler: MainScheduler.instance)
.subscribeNext({ sec -> Void in
print("\(sec) s")
}).addDisposableTo(disposeBag!)
pauseResumeButton.rx_tap
.map{ !self.isRunning.value }
.startWith(true)
.bindTo( isRunning )
.addDisposableTo(disposeBag!)
Run Code Online (Sandbox Code Playgroud)
isRunning显然是一个变量.我可以停止计时器设置disposeBag = nil但是我不能暂停它.... itried过滤事件但计数显然继续增长...
谁能帮我?谢谢!
我创建了下面的函数与多个observable的链接,但无论我做什么它似乎没有调用completed?它只返回以下内容:
(facebookSignInAndFetchData()) -> subscribed
(facebookSignInAndFetchData()) -> Event next(())
Run Code Online (Sandbox Code Playgroud)
即使我debug单独观察他们都会回归completed
这是我的链接功能
func facebookSignInAndFetchData() {
observerFacebook.flatMap { (provider: FacebookProvider) in
return provider.login()
}.flatMap { token in
return self.loginViewModel.rx_authenticate(token: token)
}.flatMap {
return self.loginViewModel.fetchProfileData()
}.debug().subscribe(onError: { error in
//Guard unknown ErrorType
guard let err = error as? AuthError else {
//Unknown error message
self.alertHelper.presentAlert(L10n.unknown)
return
}
//error message handling
switch err {
case .notLoggedIn:
print("not logged in")
break
default:
self.alertHelper.presentAlert(err.description)
}
}, onCompleted: {
self.goToInitialController()
}).addDisposableTo(self.disposeBag)
}
Run Code Online (Sandbox Code Playgroud)
rx_authenticate …
我在RxSwift中学习了示例代码.在文件GithubSignupViewModel1.swift中,validatedUsername的定义是:
validatedUsername = input.username //the username is a textfiled.rx_text
.flatMapLatest { username -> Observable<ValidationResult> in
print("-------->1:")
return validationService.validateUsername(username)
.observeOn(MainScheduler.instance)
.catchErrorJustReturn(.Failed(message: "Error contacting server"))
}
.shareReplay(1)
Run Code Online (Sandbox Code Playgroud)
validateUsername方法最终被称为以下方法:
func usernameAvailable(username: String) -> Observable<Bool> {
// this is ofc just mock, but good enough
print("-------->2:")
let URL = NSURL(string: "https://github.com/\(username.URLEscaped)")!
let request = NSURLRequest(URL: URL)
return self.URLSession.rx_response(request)
.map { (maybeData, response) in
print("-------->3:")
return response.statusCode == 404
}
.catchErrorJustReturn(false)
}
Run Code Online (Sandbox Code Playgroud)
这是我的困惑:
每当我在用户名文本字段中快速输入一个字符时,消息--------> 1:,--------> 2:显示,以及稍后的消息-------- > 3:显示,但只显示一个--------> 3:消息.
当我输入较慢的字符时,消息--------> 1:,--------> 2:,--------> 3:连续显示.
但是当我将flatMapLatest更改为flatMap时,我输入了多少个字符,我将得到相同数量的--------> 3:message. …
我使用以下代码创建一个observable:
let disposeBag = DisposeBag()
let myJust = { (element: String) -> Observable<String> in
return Observable.create { observer in
observer.on(.next(element))
//observer.on(.completed)
return Disposables.create()
}
}
Run Code Online (Sandbox Code Playgroud)
该代码来自RxSwift的示例代码.
如果我创建一个空的Observable myJust,稍后我会尝试发送一个值:
myJust("").on(.completed)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
error: value of type 'Observable<String>' has no member 'on'
Run Code Online (Sandbox Code Playgroud) 观察和主题之间有什么区别.当我定义一个可观察的类型变量时.它可以发出onNext,onComplete,onDispose.但是主题也可以这样做.什么时候应该使用observable,在什么情况下我应该使用subject?
我有一个变量,它是一个枚举值数组.这些值随时间而变化.
enum Option {
case One
case Two
case Three
}
let options = Variable<[Option]>([ .One, .Two, .Three ])
Run Code Online (Sandbox Code Playgroud)
然后我观察这个变量的变化.问题是,我需要知道最新值和前一个值之间的差异.我现在正在这样做:
let previousOptions: [Option] = [ .One, .Two, .Three ]
...
options
.asObservable()
.subscribeNext { [unowned self] opts in
// Do some work diff'ing previousOptions and opt
// ....
self.previousOptions = opts
}
Run Code Online (Sandbox Code Playgroud)
是否内置了RxSwift可以更好地管理它?有没有办法始终从信号中获取先前值和当前值?
我有一个Observable,它只用于触发flatMap/ map.所以我只需要这个Next活动,而不是一个价值.我可以将自己的概念用于这样的垃圾值,但我想知道是否有一个RxSwift约定.
这是我正在处理的事情:
// I'd rather not have an Element type that someone might use
let triggeringObservable: Observable<SomeSessionClass>
// ...
triggeringObservable.map { _ -> String in // The actual value is ignored
return SomeLibrary.username() // `username()` is only ready when `triggeringObservable` sends Next
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,triggeringObservable是rx_observer在将让我们知道,库某些属性username()是随时可以调用.
我想有一个UITextField配置RxSwift/RxCocoa,以便它只包含...字符.我不想使用UITextFieldDelegate这个,但很想用RxSwift/RxCocoa实现这一点.有没有办法做到这一点?