我目前正在使用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) 我需要使用RxSwift选择集合视图中特定索引处的项目.此方法无法正常工作.
collectionView.rx.modelSelected(SearchResult.self).subscribe(onNext:{ menuItem in }).addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
我有以下属性结构 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) 要RxSwift在Swift 2中创建一个可观察的数组,我用它来做:
[1, 2, 3].toObservable().subscribeNext { print($0) }
Run Code Online (Sandbox Code Playgroud)
但是在Swift 3中,它不再起作用了,我收到了这个错误:
类型'[Int]'的值没有成员'toObservable'
如何RxSwift从swift数组创建一个可观察的数组?
我从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)
你能帮我吗?谢谢
我正在使用RxSwift我的UIViewController包含UICollectionView. 我试图在我的集合视图中添加一个标题,但从未调用过:
func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath)
Run Code Online (Sandbox Code Playgroud) 假设我有 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)
它似乎有效,但显然结果只有在所有网络请求完成后才会发出下一个元素。
我需要的是按顺序发送请求,并可观察结果,一旦每个请求完成,就会发出下一个事件。 …
在 observeOn 的上下文中使用 RxSwift 的MainSchedule.instance和MainSchedule.asyncInstance有什么区别?
我使用以下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) 我正在尝试构建一个倒计时器应用程序。当然,我需要一个Observable<Int>每秒给我一个元素的序列。不同的是,我需要这个序列来响应其他两个序列的更改:
Observable<Bool>。这模拟了用户按下暂停/恢复按钮Observable<Void>。这模拟了用户按下重置按钮的情况。重置按钮会将计时器重置回其起始值 ( resetState),并暂停计时器。
用户可以随时按下重置按钮:
结合这个问题和这个问题的答案,我能够想出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)