标签: rx-cocoa

选择器可观察 - RxSwift

我正在尝试将我的FRP理解从ReactiveCocoa 2.5迁移到RxSwift,我有一个误解.在ReactiveCocoa中,我rac_signalForSelector想在观察方法的调用时使用.有没有办法使用RxSwift实现这个逻辑?

我写了一个小例子,我想在test方法调用时处理订阅.但是在订阅块中我仍然可以看到一个next(6)事件.我究竟做错了什么?

let subject = PublishSubject<Int>()
subject.takeUntil(self.rx.sentMessage(#selector(test))).subscribe { event in
    print(event)
}

subject.onNext(3)
test()
subject.onNext(6)

//////////////////

func test() {

}
Run Code Online (Sandbox Code Playgroud)

ios swift rx-swift reactivex rx-cocoa

2
推荐指数
1
解决办法
2837
查看次数

没有“项目”候选项产生预期的上下文结果类型“((Observable &lt;[Product]&gt;)-&gt;(_)-&gt; _”

这是我的代码段:

class ProductCategoryCell: UITableViewCell {

  @IBOutlet weak var collectionViewProducts: UICollectionView!

  // other stuff...

  func setProducts() {
    let productsObservable = Observable.just([
      Product(name: "test", price: 10.0),
      Product(name: "test", price: 10.0),
      Product(name: "test", price: 10.0)
    ])

    productsObservable.bindTo(collectionViewProducts.rx.items(cellIdentifier: "ProductCell", cellType: ProductCell.self)) {
      (row, element, cell) in
      cell.setProduct(element)
    }.disposed(by: disposeBag)
  }
}
Run Code Online (Sandbox Code Playgroud)

它给了我一个构建错误:

没有“项目”候选项产生预期的上下文结果类型“((Observable <[Product]>)->(_)-> _”

在我的视图控制器中,我用类似的代码填充表视图:

let productsObservable = Observable.just(testProducts)
productsObservable.bindTo(tableViewProducts.rx.items(cellIdentifier: "ProductCategoryCell", cellType: ProductCategoryCell.self)) { (row, element, cell) in
        cell.setCategory(category: element)
}.disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

此代码正常工作。我究竟做错了什么?

uicollectionview swift rx-swift rx-cocoa

2
推荐指数
1
解决办法
3906
查看次数

TabelView使用RxSwift委派方法

我正在使用RxSwift for TableView.我需要先计算WillDisplayCell委托方法中我做过的动态单元格的高度.我不知道如何将TableView Delegate方法与RxSwift绑定.任何人都可以帮忙吗?

ios rx-swift swift3 rx-cocoa

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

如何在按钮点击时观察 PublishSubject

我正在处理这种情况,我想在这里应用 RxSwift。

我有.xib带按钮的 UIView。

class RightButtonItemView: UIView {

    @IBOutlet weak var rightButtonimageView: UIImageView!
    @IBOutlet weak var rightButtonButton: UIButton!

    let performEventSegue = PublishSubject<Bool>()

    class func instanceFromNib() -> RightButtonItemView {
        return UINib(nibName: "NotificationView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as!  RightButtonItemView
    }

    override func awakeFromNib() {
       //I'm not sure how should I link button tap and my subject 
       rightButtonButton.rx.tap
    }
}
Run Code Online (Sandbox Code Playgroud)

我在 viewController 中创建了这个视图的一个实例

var rightButtonItemView = RightButtonItemView.instanceFromNib()
Run Code Online (Sandbox Code Playgroud)

Bu从我的segue点击这个按钮我需要移动到下一个VC,所以我订阅了UIView的主题

rightButtonItemView.performEventSegue.asObserver().subscribe(onNext: { (isAuthorized) in

        if isAuthorized {
            let storyboard = UIStoryboard(name: "Notifications", …
Run Code Online (Sandbox Code Playgroud)

uiview ios rx-swift rx-cocoa

2
推荐指数
1
解决办法
1621
查看次数

RxSwift + RxRealm + RxCocoa将行插入UITableView

当我观察我的领域模型并将更改绑定到表视图时,它可以工作.但是当我尝试向表中添加行时,我发生了一些崩溃

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'尝试将第1行插入第0部分,但更新后第0部分只有1行'

我可以不使用标准委托方法吗?

这是我的代码片段

        let realm = try! Realm()

    let places = realm.objects(Place.self)

    Observable.from(places)
        .bindTo(tableView.rx.items(cellIdentifier: "PlaceCell", cellType: PlaceCell.self)) { (row, element, cell) in
            let viewModel = PlaceCellViewModel(place: element)
            cell.setup(viewModel: viewModel)
        }
        .addDisposableTo(disposeBag)

    Observable.changesetFrom(places).subscribe(onNext: { [weak self] result, changes in

        if let changes = changes {
            self?.tableView.beginUpdates()
            let indexes = changes.inserted.map { IndexPath(row: $0, section: 0) }
            self?.tableView.insertRows(at: indexes, with: .bottom)
            self?.tableView.endUpdates()
        } else {
            self?.tableView.reloadData()
        }

        })
        .addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)

realm swift rx-swift rx-cocoa

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

RxSwift-表格视图中的Textfield-Variable绑定

我是RxSwift的新手,我有以下代码来设置一个包含文本字段的tableview:

budget.expenses.asObservable()
  .bindTo(tableView.rx.items(cellIdentifier: ExpenseInputCell.cellIdentifier, cellType: ExpenseInputCell.self)){(row, element, cell) in

  cell.name.text = element.name.value
  cell.name.rx.text
    .bindTo(element.name)
    .addDisposableTo(self.disposeBag)
}
.addDisposableTo(disposeBag)

tableView.rx.itemDeleted
  .subscribe(onNext: {indexPath in
    self.budget.expenses.value.remove(at: indexPath.row)
  })
  .addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)

一切工作正常,直到删除一行,因为然后混合了文本字段与数组中正确对象的绑定。例如,假设我在表视图中有7个项目,并且删除了第5行,新的第5和第6行的值都相同

uitableview ios swift rx-swift rx-cocoa

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

如何检测observable是否在RxSwift中没有在特定时间内发出任何事件

我试图检测一个observable(我的情况button.rx.tap)是否没有发出任何值,比如3秒.如果是,我想更新用户界面.这是我到目前为止的尝试:

Observable<Int>.interval(3, scheduler: MainScheduler.instance)
    .takeUntil(button.rx.tap) // I know take until will stop the timer sequence 
    .subscribe({ event in
        print(event)
        UIView.animate(withDuration: 0.4, animations: {
            if let number = event.element {
                let scale: CGFloat = number % 2 == 0 ? 1.5 : 1.0
                self.button.transform = CGAffineTransform(scaleX: scale, y: scale)
            }
        })
    })
    .addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)

我的目标是在没有按下按钮三秒钟时为视图设置动画.我已经尝试过扫描,distinctUntilChangeddebounce但是我遇到的大多数组合运算符只会在observable发出一个项目时才会发出项目.任何帮助深表感谢.

reactive-programming swift rx-swift rx-cocoa

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

链接RxSwift可以观察到不同类型

我需要从网络请求不同类型的模型,然后将它们组合为一个模型。如何链接多个可观察物并返回另一个可观察物?

我有类似的东西:

func fetchDevices() -> Observable<DataResponse<[DeviceModel]>>

func fetchRooms() -> Observable<DataResponse<[RoomModel]>>

func fetchSections() -> Observable<DataResponse<[SectionModel]>> 
Run Code Online (Sandbox Code Playgroud)

我需要做类似的事情:

func fetchAll() -> Observable<(AllModels, Error)> {
    fetchSections()

    // Then if sections is ok I need to fetch rooms
    fetchRooms()

    // Then - fetch devices
    fetchDevices()

    // And if everything is ok create AllModels class and return it
    // Or return error if any request fails
    return AllModels(sections: sections, rooms: rooms, devices:devices)
  }
Run Code Online (Sandbox Code Playgroud)

如何用RxSwift实现呢?我阅读了文档和示例,但了解了如何链接相同类型的可观察对象

ios swift rx-swift rx-cocoa

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

使用RxSwift即时更改文本字段的格式

我想给我的文本字段一个货币格式,所以当我键入它的时候看起来像:

$ 0.00
$ 0.09
$ 0.98
$ 9.87
$ 98.76

由于我在项目中使用Rx,因此我真的不想使用通知或委托。

ios swift rx-swift rx-cocoa

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

从异步完成处理程序返回的RXSwift flatmap

我正在尝试创建一个searchBar,它通过带有请求的MKLocalSearch搜索地址,并使用RXSwift并绑定到RXCocoa

到目前为止,我已经做了以下1.过滤和去抖,以避免太多的请求:

let searchRes = searchBar.rx.text
    .orEmpty
    .filter { query in
        return query.characters.count > 4
    }
    .debounce(1, scheduler: MainScheduler.instance)
Run Code Online (Sandbox Code Playgroud)
  1. 生成的String查询是map:ed以创建MKLocationSearch,然后是flatMapp:ed以返回MKMapItems数组,以便能够将数组绑定到tableView的项目:

    searchRes.map{query -> MKLocalSearch in
        let request = MKLocalSearchRequest()
        request.naturalLanguageQuery = query
        request.region = self.mapView.region
        return MKLocalSearch(request: request)
    }.flatMapLatest{search -> Observable<[MKMapItem]> in
        search.start(completionHandler:{(response, error) in
            let items: Variable<[MKMapItem]> = Variable([])
            if let resp = response {
                //need to return the result form this
                // i.e. items.value = response.mapItems
            }
            //can not return from here since the request is async
        }
    }.bindTo …
    Run Code Online (Sandbox Code Playgroud)

swift rx-swift rx-cocoa

0
推荐指数
1
解决办法
1646
查看次数

使用 RxSwift 和 RXCocoa 验证按钮单击时的所有文本字段

我是 RxSwift 和 RxCocoa 的新手,我正在学习它。

我想在按钮单击时验证所有文本字段,并根据验证我需要向用户显示警报消息。

验证成功后,我需要在表中插入记录。

参考以下代码...

var result = txtFname.rx.text
    result.asObservable().subscribe(onNext: { text in
        if text!.isEmpty {
            self.showAlert(msg: "Plese enter first name.")
            self.txtFname.becomeFirstResponder()
        }
    }).disposed(by: disposeBag)

    result = txtLname.rx.text
    result.asObservable().subscribe(onNext: { text in
        if text!.isEmpty {
            self.showAlert(msg: "Please enter last name.")
            self.txtLname.becomeFirstResponder()
        }
    }).disposed(by: disposeBag)

    result = txtEmail.rx.text
    result.asObservable().subscribe(onNext: { text in

        if text!.isEmpty {
            self.showAlert(msg: "Please enter email id.")
            self.txtLname.becomeFirstResponder()
        }
    }).disposed(by: disposeBag)

   //need to check here if all fields are valid or not 
   //if all fields …
Run Code Online (Sandbox Code Playgroud)

uibutton ios swift rx-swift rx-cocoa

0
推荐指数
1
解决办法
2798
查看次数