我正在尝试学习库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) 我只是在学习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)
如何更新标签字段?我看了很多例子,但似乎找不到回答这个问题的例子.
我知道我可以执行以下操作将更改映射到自定义对象的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),映射并将更改绑定到当前注释中.当前注释返回一个带有带有文本字符串字段的注释的变量.
我正在尝试使用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) 这是我的班级:
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)
它只是第一次发射,有什么问题?
我正在尝试将UIPickerView与RxSwift一起使用.有没有办法包装UIPickerView数据源和委托方法与Observables一起使用?我正在尝试做类似的事情
dataSequence
.bindTo(pickerView.rx_itemsWithDataSource(dataSource))
Run Code Online (Sandbox Code Playgroud)
我看到有一个UITableview的预制库 https://github.com/RxSwiftCommunity/RxDataSources,但我想知道是否有一种简单的方法可以将其用于需要使用RxSwift的dataSource和委托的其他内容.
我正在尝试构建一个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永远不会被调用!
这背后的原因是:
任何帮助将不胜感激.
谢谢
该模型
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) 我想从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)
我在某处展示了这种可能性,但无法回忆起它.你知道怎么做吗?
据我所知,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) 我使用以下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) rx-swift ×10
swift ×7
ios ×5
rx-cocoa ×3
combine ×1
connectivity ×1
frp ×1
moya ×1
mvvm ×1
observable ×1
swift4 ×1
swiftui ×1
uitableview ×1