标签: rx-swift

处理网络错误以及绑定到tableView(Moya,RxSwift,RxCocoa)

我目前正在使用Moya来发出我的网络请求.我已经从其中一个示例项目实现了以下内容@ https://github.com/DroidsOnRoids/RxSwiftExamples#tutorials

下面我设置了restaurantSearch,这样当有人输入文本时,它会发出新的请求.

var restaurantSearch: Observable<(String)> {
    return searchBar
        .rx_text
        .throttle(0.5, scheduler: MainScheduler.instance)
        .distinctUntilChanged()
}
Run Code Online (Sandbox Code Playgroud)

我有一个方法返回类型[餐厅]的观察

func restaurants() -> Observable<[Restaurant]> {
    return restaurantSearch
        .observeOn(MainScheduler.instance)
        .flatMapLatest { postcode -> Observable<[Restaurant]?> in
            return self.getRestaurants(postcode, cuisine: "", restaurantName: "")
        }.replaceNilWith([])
}

internal func getRestaurants(postcode: String, cuisine: String, restaurantName: String) -> Observable<[Restaurant]?> {
    return self.justEatProvider
        .request(.Restaurant(postcode, cuisine, restaurantName))
        .debug()
        .mapArrayOptional(Restaurant.self, keyPath: "Restaurants")
}
Run Code Online (Sandbox Code Playgroud)

我正在调用此方法并将其绑定到tableView,如下所示:

func setupRx() {

    api = JustEatApi(provider: provider, restaurantSearch: restaurantSearch)

    api
        .restaurants()
        .bindTo(tableView.rx_itemsWithCellIdentifier("RestaurantTableViewCell", cellType: RestaurantTableViewCell.self)) { (row, element, cell) in
            cell.restaurant …
Run Code Online (Sandbox Code Playgroud)

uitableview swift rx-swift moya

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

如何在RxSwift中选择CollectionView单元格

我需要使用RxSwift选择集合视图中特定索引处的项目.此方法无法正常工作.

 collectionView.rx.modelSelected(SearchResult.self).subscribe(onNext:{ menuItem in }).addDisposableTo(disposeBag) 
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

ios uicollectionview rx-swift swift3

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

更改变量中的一个属性会触发其他属性的子目录.RxSwift

我有以下属性结构 Chat

struct Chat {
    var id = String()
    var gender = String()
    var date = Date()

    init() {}
}
Run Code Online (Sandbox Code Playgroud)

在视图控制器中,我声明了一个名为Chat的实例observablechat,然后我使用flatmap运算符来尝试并观察date属性的变化observablechat.但是,如果我更改性别属性(如图所示),则会触发订阅.我想知道为什么会这样,我如何修复此代码,以便订阅只查看date属性发生了什么,没有别的?

class ViewController: UIViewController {

    var observablechat = Variable(Chat())

        observablechat.asObservable()
        .flatMap { (Chat) -> Observable<Date> in
            return Observable.of(Chat.matchDate)
        }.subscribe(onNext: { (r) in
            print(r)
        }).addDisposableTo(disposeBag)


        self.observablechat.value.gender = "male" 
        //triggers subscription above. 
    }
}
Run Code Online (Sandbox Code Playgroud)

system.reactive ios rxjs swift rx-swift

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

使用RxSwift观察Swift 3中的数组

RxSwift在Swift 2中创建一个可观察的数组,我用它来做:

[1, 2, 3].toObservable().subscribeNext { print($0) }
Run Code Online (Sandbox Code Playgroud)

但是在Swift 3中,它不再起作用了,我收到了这个错误:

类型'[Int]'的值没有成员'toObservable'

如何RxSwift从swift数组创建一个可观察的数组?

ios swift rx-swift reactivex

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

具有最后状态的RxJava Observable

我从RxJava开始,我想创建一个可以保存最后状态的observable ...

在RxSwift中,这将是Variable(https://github.com/ReactiveX/RxSwift/blob/master/Documentation/GettingStarted.md#variables),但我无法在RxJava中找到等效的...

我找到了一个解决方案,但它是很多锅炉板代码

private boolean isGettingCompanies = false;

public boolean isGettingCompanies() {
    return isGettingCompanies;
}

private void setIsGettingCompanies(boolean isGettingCompanies) {
    this.isGettingCompanies = isGettingCompanies;
    isGettingCompaniesPublishSubject.onNext(isGettingCompanies);
}

private final PublishSubject<Boolean> isGettingCompaniesPublishSubject = PublishSubject.create();

public Observable<Boolean> isGettingCompaniesPublishSubject() {
    return isGettingCompaniesPublishSubject.asObservable();
}
Run Code Online (Sandbox Code Playgroud)

RxSwift的等价物就是这个

private(set) var isGettingCompanies: Variable = Variable(false)
Run Code Online (Sandbox Code Playgroud)

你能帮我吗?谢谢

java frp observable rx-java rx-swift

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

RxSwift 和 UICollectionView 标头

我正在使用RxSwift我的UIViewController包含UICollectionView. 我试图在我的集合视图中添加一个标题,但从未调用过:

func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath)
Run Code Online (Sandbox Code Playgroud)

ios uicollectionview swift rx-swift

7
推荐指数
3
解决办法
9701
查看次数

RxSwift - 如何按顺序链接可观察量

假设我有 Int 数组:

var items = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

一个接受 Int 参数并基于它发送网络请求的函数:

 func sendRequest(argument: Int) -> Observable<Void> {
    // sends network request
    ...
 }
Run Code Online (Sandbox Code Playgroud)

我想为 items 数组的每个元素发送网络请求,但我想按顺序执行,仅在前一个请求完成后才发送下一个请求。

我的第一次尝试是这样的:

let observables = items.map{ [weak self] argument in (self?.sendRequest(argument: argument) ?? Observable.empty()) }

let result = Observable.concat(observables)
Run Code Online (Sandbox Code Playgroud)

然而,这种方法同时发送请求并且仅按顺序组合结果。

我的第二种方法:

let items = [1, 2, 3, 4, 5]

var result = Observable.just(Void())

for item in items {
    result = result.flatMap{ [weak self] in  
        self?.sendRequest(argument: item) ?? Observable.empty() 
    }
}
Run Code Online (Sandbox Code Playgroud)

它似乎有效,但显然结果只有在所有网络请求完成后才会发出下一个元素。

我需要的是按顺序发送请求,并可观察结果,一旦每个请求完成,就会发出下一个事件。 …

iphone observable ios swift rx-swift

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

RxSwift -- MainScheduler.instance 与 MainScheduler.asyncInstance

在 observeOn 的上下文中使用 RxSwift 的MainSchedule.instanceMainSchedule.asyncInstance有什么区别

reactive-programming ios reactive-cocoa swift rx-swift

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

将 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
查看次数

如何制作可重置的 RxSwift 计时器?

我正在尝试构建一个倒计时器应用程序。当然,我需要一个Observable<Int>每秒给我一个元素的序列。不同的是,我需要这个序列来响应其他两个序列的更改:

  • 暂停:Observable<Bool>。这模拟了用户按下暂停/恢复按钮
  • 重置:Observable<Void>。这模拟了用户按下重置按钮的情况。

重置按钮会将计时器重置回其起始值 ( resetState),并暂停计时器

用户可以随时按下重置按钮:

  1. 定时器未启动时重置
  2. 定时器运行时重置,未暂停,未结束
  3. 当计时器暂停而不是结束时重置
  4. 计时器结束后重置

结合这个问题这个问题的答案,我能够想出Timer这样的课程:

class Timer {
    var paused = true
    {
        didSet {
            rxPaused.accept(paused)
        }
    }
    var ended = false

    let rxPaused = BehaviorRelay(value: true)
    let disposeBag = DisposeBag()

    // timerEvents is the observable that client code should subscribe to
    var timerEvents: Observable<Int>!

    var currentState: Int
    let resetState: Int

    init(resetState: Int) {
        self.currentState = resetState
        self.resetState = …
Run Code Online (Sandbox Code Playgroud)

timer swift rx-swift

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