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()