RxSwift 过滤器 UICollectionView numberOfItems(:) 的 Observable 变量
RxSwift filter Observable variable for UICollectionView numberOfItems(: )
我是 ReactiveSwift 的初学者,我有一个 UICollectionView
。我的目标是过滤/编辑 UICollectionView 的 Observable
数组。在过滤没有结果后,我尝试过滤后打印出来,过滤计数是正确的,但我猜是类型错误。
items >> RxSwift.(unknown context at 24d7ea8).Map<Swift.Array<ReactiveThings.AnotherController.Element>, Swift.Array<ReactiveThings.AnotherController.Element>>
这些是输出。
DispatchQueue.main.asyncAfter(deadline: .now() + 3.5) {
let items = observableElement.asObservable().map { element in
element.filter {
[=11=].age > 15
}
}
print("items >> ", items)
}
这是我的代码。
import UIKit
import RxSwift
import RxCocoa
public final class AnotherController: UIViewController, UICollectionViewDelegateFlowLayout {
let disposeBag = DisposeBag()
var collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
var cv = UICollectionView.init(frame: .zero, collectionViewLayout: layout)
cv.translatesAutoresizingMaskIntoConstraints = false
return cv
}()
private func setup() {
view.addSubview(collectionView)
collectionView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
collectionView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
collectionView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "CustomCelly")
collectionView.rx.setDelegate(self).disposed(by: disposeBag)
var observableElement = Observable.just(elementArray)
observableElement.bind(to: collectionView.rx.items(cellIdentifier: "CustomCelly")) { _, eleman, cell in
if let cellToUse = cell as? UICollectionViewCell {
cellToUse.backgroundColor = .red
}
}.disposed(by: disposeBag)
DispatchQueue.main.asyncAfter(deadline: .now() + 3.5) {
let items = observableElement.asObservable().map { element in
element.filter {
[=12=].age > 15
}
}
print("items >> ", items)
}
}
struct Element {
let name: String
let age: Int
}
var elementArray = [
Element.init(name: "E0", age: 15),
Element.init(name: "E1", age: 12),
Element.init(name: "E2", age: 13),
Element.init(name: "E3", age: 14),
Element.init(name: "E4", age: 17),
Element.init(name: "E5", age: 18)
]
public override func viewDidLoad() {
super.viewDidLoad()
setup()
}
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: UIScreen.main.bounds.width, height: 100)
}
我想在一个动作之后实现对数据的操作,例如在 UIButton
点击之后,模型数组的数量可能会从 6 减少到 3。
提前致谢
没有类型错误。您正在打印 Observable 本身,而不是 Observable 发出的值。所以你在打印输出中看到的是 Observable 的描述。
要实现你想要的,你只需要:
let observableElement = button.rx.tap
.map { [elementArray] in
elementArray.filter { [=10=].age > 15 }
}
.startWith(elementArray)
要进行更精细的操作,您可能需要使用 scan
运算符来设置状态机。
要打印出 Observable 发出的值,请使用 debug
运算符:
observableElement
.map { element in
element.filter { [=11=].age > 15 }
}
.debug("items >>")
.subscribe()
我是 ReactiveSwift 的初学者,我有一个 UICollectionView
。我的目标是过滤/编辑 UICollectionView 的 Observable
数组。在过滤没有结果后,我尝试过滤后打印出来,过滤计数是正确的,但我猜是类型错误。
items >> RxSwift.(unknown context at 24d7ea8).Map<Swift.Array<ReactiveThings.AnotherController.Element>, Swift.Array<ReactiveThings.AnotherController.Element>>
这些是输出。
DispatchQueue.main.asyncAfter(deadline: .now() + 3.5) {
let items = observableElement.asObservable().map { element in
element.filter {
[=11=].age > 15
}
}
print("items >> ", items)
}
这是我的代码。
import UIKit
import RxSwift
import RxCocoa
public final class AnotherController: UIViewController, UICollectionViewDelegateFlowLayout {
let disposeBag = DisposeBag()
var collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
var cv = UICollectionView.init(frame: .zero, collectionViewLayout: layout)
cv.translatesAutoresizingMaskIntoConstraints = false
return cv
}()
private func setup() {
view.addSubview(collectionView)
collectionView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
collectionView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
collectionView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "CustomCelly")
collectionView.rx.setDelegate(self).disposed(by: disposeBag)
var observableElement = Observable.just(elementArray)
observableElement.bind(to: collectionView.rx.items(cellIdentifier: "CustomCelly")) { _, eleman, cell in
if let cellToUse = cell as? UICollectionViewCell {
cellToUse.backgroundColor = .red
}
}.disposed(by: disposeBag)
DispatchQueue.main.asyncAfter(deadline: .now() + 3.5) {
let items = observableElement.asObservable().map { element in
element.filter {
[=12=].age > 15
}
}
print("items >> ", items)
}
}
struct Element {
let name: String
let age: Int
}
var elementArray = [
Element.init(name: "E0", age: 15),
Element.init(name: "E1", age: 12),
Element.init(name: "E2", age: 13),
Element.init(name: "E3", age: 14),
Element.init(name: "E4", age: 17),
Element.init(name: "E5", age: 18)
]
public override func viewDidLoad() {
super.viewDidLoad()
setup()
}
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: UIScreen.main.bounds.width, height: 100)
}
我想在一个动作之后实现对数据的操作,例如在 UIButton
点击之后,模型数组的数量可能会从 6 减少到 3。
提前致谢
没有类型错误。您正在打印 Observable 本身,而不是 Observable 发出的值。所以你在打印输出中看到的是 Observable 的描述。
要实现你想要的,你只需要:
let observableElement = button.rx.tap
.map { [elementArray] in
elementArray.filter { [=10=].age > 15 }
}
.startWith(elementArray)
要进行更精细的操作,您可能需要使用 scan
运算符来设置状态机。
要打印出 Observable 发出的值,请使用 debug
运算符:
observableElement
.map { element in
element.filter { [=11=].age > 15 }
}
.debug("items >>")
.subscribe()