标签: rx-swift

如何在RxSwift中翻译if-else?

我正在尝试学习库RxSwift

我有一些像这样的代码:

if data.checkAllIsOk()
{ 
    [do things]
}
else
{ 
    [show alert]
}
Run Code Online (Sandbox Code Playgroud)

现在我需要在检查之前更新服务器上的数据,因此我建模了一个返回Observable的getData().

我目前的做法是:

getData()  
    >- flatMap{ (data:Data) -> Observable<Bool> in
        _=0 // workaround for type inference bugs
        return just(data.checkAllIsOk())
    }
    >- subscribeNext{ (ok) -> Void in
        if ok
        {
            [do the things]
        }
        else
        {
            [show the alert]
        }
    } 
    >- disposeBag.addDisposable()
Run Code Online (Sandbox Code Playgroud)

它的工作原理(或它应该,我仍然在写它),但它感觉不对..是否有更"反应"的方式来做它?什么是最合适的运营商?

也许为"false"返回错误并使用catch块?

更新

按照ssrobbi建议的方法,我在2个不同的subscribeNext中拆分了2个分支,并使用过滤器来选择正或负分支.这是产生的代码:

let checkData=getData()  
        >- flatMap{ (data:Data) -> Observable<Bool> in
            _=0 
            return just(data.checkAllIsOk())
        }
        >- shareReplay(1)
}
[...]
checkData
    >- filter{ (ok) -> …
Run Code Online (Sandbox Code Playgroud)

reactive-programming swift rx-swift

7
推荐指数
1
解决办法
3027
查看次数

当UITextField以编程方式更新时,RxSwift - UILabel字段未更新

我只是在学习RxSwift并有一个简单的例子,我不确定它为什么不起作用.我有一个文本字段和一个标签字段.任何时候文本字段都会改变,我希望更新标签字段.如果我输入文本字段,一切都按预期工作.如果我以编程方式设置文本字段,例如当我按下按钮并显式设置文本字段时,标签字段不会更新.

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
  @IBOutlet weak var myTextField: UITextField!
  @IBOutlet weak var myLabel: UILabel!

  override func viewDidLoad() {
    super.viewDidLoad()
    myTextField.rx_text.bindTo(myLabel.rx_text)
  }

  @IBAction func pBtn(sender: UIButton) {
    myTextField.text = "45"
  }
}
Run Code Online (Sandbox Code Playgroud)

如何更新标签字段?我看了很多例子,但似乎找不到回答这个问题的例子.

ios swift rx-swift

7
推荐指数
1
解决办法
3227
查看次数

RxSwift方法将UITextView的文本映射并绑定到自定义对象的文本字段?

我知道我可以执行以下操作将更改映射到自定义对象的Notes'文本字段到UITextView.

self.notesViewModel.currentNote()
           .map { $0.text }
           .bindTo(self.notesTextView.rx_text)
Run Code Online (Sandbox Code Playgroud)

如何使用相同的模式进行反向操作?该模式是notesTextView.rx_text,将其映射到当前音符的文本.我知道如何做以下感觉非RxSwift-y:

_ = notesTextView.rx_text.subscribeNext { someText in
    self.notesViewModel.currentNote().value.text = someText
}
Run Code Online (Sandbox Code Playgroud)

IOW,似乎我应该能够获取UITextView(aka notesTextView),映射并将更改绑定到当前注释中.当前注释返回一个带有带有文本字符串字段的注释的变量.

swift rx-swift

7
推荐指数
1
解决办法
6897
查看次数

RxSwift正确的方式

我正在尝试使用RxSwift编写一个MVVM,并与我在ReactiveCocoa中为Objective-C做的比较,以正确的方式编写我的服务有点困难.

例子是登录服务.

使用ReactiveCocoa(Objective-C)我编写如下代码:

// ViewController


// send textfield inputs to viewmodel 
RAC(self.viewModel, userNameValue) = self.fieldUser.rac_textSignal;
RAC(self.viewModel, userPassValue) = self.fieldPass.rac_textSignal;

// set button action
self.loginButton.rac_command = self.viewModel.loginCommand;

// subscribe to login signal
[[self.viewModel.loginResult deliverOnMainThread] subscribeNext:^(NSDictionary *result) {
    // implement
} error:^(NSError *error) {
    NSLog(@"error");
}];
Run Code Online (Sandbox Code Playgroud)

我的viewModel应该是这样的:

// valid user name signal
self.isValidUserName = [[RACObserve(self, userNameValue)
                         map:^id(NSString *text) {
                             return @( text.length > 4 );
                         }] distinctUntilChanged];

// valid password signal
self.isValidPassword = [[RACObserve(self, userPassValue)
                         map:^id(NSString *text) {
                             return @( text.length > …
Run Code Online (Sandbox Code Playgroud)

mvvm frp reactive-cocoa swift rx-swift

7
推荐指数
1
解决办法
2800
查看次数

如何在RxSwift中观察数组属性的变化

这是我的班级:

class ViewController: UIViewController {
   var myArray : NSArray!
} 
Run Code Online (Sandbox Code Playgroud)

我想每次myArray指向一个新数组时触发一个事件,如下所示:

self.myArray = ["a"]

self.myArray = ["b"]
Run Code Online (Sandbox Code Playgroud)

我试过rx_observe但失败了,这是我的代码:

self.rx_observe(NSArray.self, "myArray").subscribeNext { (array) -> Void in
   print(array)
}
Run Code Online (Sandbox Code Playgroud)

它只是第一次发射,有什么问题?

key-value-observing swift rx-swift

7
推荐指数
1
解决办法
8677
查看次数

如何使用RxSwift使用dataSource和委托方法

我正在尝试将UIPickerView与RxSwift一起使用.有没有办法包装UIPickerView数据源和委托方法与Observables一起使用?我正在尝试做类似的事情

dataSequence
    .bindTo(pickerView.rx_itemsWithDataSource(dataSource))
Run Code Online (Sandbox Code Playgroud)

我看到有一个UITableview的预制库 https://github.com/RxSwiftCommunity/RxDataSources,但我想知道是否有一种简单的方法可以将其用于需要使用RxSwift的dataSource和委托的其他内容.

reactive-programming ios swift rx-swift

7
推荐指数
1
解决办法
1290
查看次数

RxSwift基于变量构建一个Observable

我正在尝试构建一个Observable,它将根据Variable的值输出一个值.

像这样的东西:

let fullName = Variable<String>("")
let isFullNameOKObs: Observable<Bool>

isFullNameOKObs = fullName
            .asObservable()
            .map { (val) -> Bool in
                // here business code to determine if the fullName is 'OK'
                let ok = val.characters.count >= 3
                return ok
            }
Run Code Online (Sandbox Code Playgroud)

不幸的是,map func中的bloc永远不会被调用!

这背后的原因是:

  1. fullName变量绑定到UITextField,并使用RxSwift示例中定义的双向运算符< - >.
  2. 将观察到isFullNameOKObs Observable 隐藏或显示我的ViewController的提交按钮.

任何帮助将不胜感激.

谢谢

该模型

class Model {

    let fullName = Variable<String>("")
    let isFullNameOKObs: Observable<Bool>

    let disposeBag = DisposeBag()

    init(){

        isFullNameOKObs = fullName
            .asObservable()
            .debug("isFullNameOKObs")
            .map { (val) -> Bool in
                let ok …
Run Code Online (Sandbox Code Playgroud)

observable ios swift rx-swift rx-cocoa

7
推荐指数
1
解决办法
3399
查看次数

tableView.rx.itemSelected中的RxSwift双映射

我想从tableView.rx.itemSelected处理过程中获取对象.这个方法返回IndexPath,所以我可以映射这个值.但是如何从索引中获取对象ViewModel

struct ViewModel {
    var items: Observable<[Item]>
}
Run Code Online (Sandbox Code Playgroud)

近似我期待这样的事情(但这个流程是错误的):

tableView.rx.itemSelected
        .map { indexPath -> Item in 
        return viewModel.items.map {$0[indexPath.row]}
        }
        ..subscribe(onNext: { [unowned self] item in
        //other actions with Item object
        })
        .disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

我在某处展示了这种可能性,但无法回忆起它.你知道怎么做吗?

uitableview ios rx-swift rx-cocoa

7
推荐指数
2
解决办法
8069
查看次数

如何使用Moya和RxSwift检查互联网?

据我所知,Alamofire内置了Reachability,所以我自己的处理程序看起来像:

import Alamofire

let reachabilityManager = NetworkReachabilityManager()
reachabilityManager.listener = { status in

switch status {

case .notReachable:
 print("The network is not reachable")
 self.onInternetDisconnection()

case .unknown :
 print("It is unknown whether the network is reachable")
 self.onInternetDisconnection() // not sure what to do for this case

case .reachable(.ethernetOrWiFi):
 print("The network is reachable over the WiFi connection")
 self.onInternetConnection()

case .reachable(.wwan):
 print("The network is reachable over the WWAN connection")
 self.onInternetConnection()

 }
}
Run Code Online (Sandbox Code Playgroud)

我正在提出以下要求:

let provider = MoyaProvider<MyMoyaRequest>()
let token = …
Run Code Online (Sandbox Code Playgroud)

connectivity internet-connection rx-swift moya swift4

7
推荐指数
1
解决办法
1590
查看次数

将 SwiftUI 按钮绑定到 AnySubscriber,就像 RxCocoa 的按钮点击一样

我使用以下UIViewController基于RxSwift/RxCocoa的代码编写一个非常简单的 MVVM 模式来绑定UIButton点击事件以触发一些Observable工作并侦听结果:

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {

    @IBOutlet weak var someButton: UIButton!

    var viewModel: ViewModel!
    private var disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        viewModel = ViewModel()
        setupBindings()
    }

    private func setupBindings() {
        someButton.rx.tap
        .bind(to: self.viewModel.input.trigger)
        .disposed(by: disposeBag)

        viewModel.output.result
            .subscribe(onNext: { element in
            print("element is \(element)")
            }).disposed(by: disposeBag)
    }
}

class ViewModel {

    struct Input {
        let trigger: AnyObserver<Void>
    }

    struct Output {
        let result: …
Run Code Online (Sandbox Code Playgroud)

ios rx-swift rx-cocoa swiftui combine

7
推荐指数
1
解决办法
5064
查看次数