标签: rx-swift

在RxSwift中手动发出事件

我是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事件.

ios reactive-cocoa swift rx-swift

14
推荐指数
1
解决办法
8956
查看次数

RxSwift合并了不同类型的Observable

我应该如何Observable在RxSwift中合并两种不同类型的s?

例如:

var a: Observable<Int>
var b: Observable<Void>
Run Code Online (Sandbox Code Playgroud)

Observable.of(a,b).merge() 因类型参数不同而无法实现.

frp swift rx-swift

14
推荐指数
2
解决办法
8739
查看次数

带rxSwift的简单计时器

我正在尝试使用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过滤事件但计数显然继续增长...

谁能帮我?谢谢!

timer swift rx-swift

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

flatMap不返回onCompleted

我创建了下面的函数与多个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 …

swift rx-swift rx-cocoa

13
推荐指数
1
解决办法
1042
查看次数

关于在RxSwift中flatMapLatest的困惑

我在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. …

functional-programming reactive-cocoa swift rx-swift

12
推荐指数
4
解决办法
1万
查看次数

如何手动将下一个信号发送到RxSwift中的observable?

我使用以下代码创建一个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)

reactive-programming ios swift rx-swift

12
推荐指数
1
解决办法
5659
查看次数

rxSwift中的observable和subject之间有什么区别

观察和主题之间有什么区别.当我定义一个可观察的类型变量时.它可以发出onNext,onComplete,onDispose.但是主题也可以这样做.什么时候应该使用observable,在什么情况下我应该使用subject?

ios swift rx-swift

12
推荐指数
1
解决办法
3875
查看次数

可观察的当前和先前价值

我有一个变量,它是一个枚举值数组.这些值随时间而变化.

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可以更好地管理它?有没有办法始终从信号中获取先前值和当前值?

swift rx-swift

11
推荐指数
5
解决办法
1万
查看次数

是否有一个Observable的首选类型,在Next事件中不需要值?

我有一个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)

在这个例子中,triggeringObservablerx_observer在将让我们知道,库某些属性username()是随时可以调用.

swift rx-swift reactivex

11
推荐指数
4
解决办法
5684
查看次数

RxSwift/RxCocoa:防止UITextField具有多个......字符

我想有一个UITextField配置RxSwift/RxCocoa,以便它只包含...字符.我不想使用UITextFieldDelegate这个,但很想用RxSwift/RxCocoa实现这一点.有没有办法做到这一点?

swift rx-swift rx-cocoa

11
推荐指数
1
解决办法
3723
查看次数