1

最初,该应用程序显示一个部分的 UIViewCollection,然后在接收到内容后出现新的部分。用户滚动集合,新的部分添加到集合的底部。

我使用 MVVM,因此在我的 ViewModel 中,我向内容数组 (model.content) 添加了一个新部分,然后通知绑定到 collectionView.rx.items(dataSource: self.dataSource) 的发布者。

因此,每次我添加该部分时,集合都在闪烁,所有单元格都在重新加载,这使得可怕的用户体验一切都在闪烁、闪烁、图片消失和出现。有没有办法不重新加载所有集合而只重新加载差异。我认为默认情况下它应该像这样工作。也许通知 BehaviorSubject 的方法是错误的想法?

我也尝试使用 RxTableViewSectionedAnimatedDataSource,但在添加每个新部分后,所有内容都会消失并将用户移动到集合视图的最顶部。

请知道如果我只是在底部添加一个部分,为什么要重新加载所有集合,如何防止它?

typealias ContentDataSource = RxCollectionViewSectionedReloadDataSource<ContentSection>

class ContentViewController: BaseViewController<ContentViewModel> {

    func setupBindings() {
         viewModel?.sectionItemsSubject
                .bind(to: collectionView.rx.items(dataSource: self.dataSource))
                .disposed(by: self.disposeBag)
    }
}


class ContentViewModel: BaseViewModel<ContentModel> {

    lazy var sectionItemsSubject = BehaviorSubject<[ContentSection]>(value: model.content)

    func updateGeneratedSection(_ section: ContentSection) {
        model.content.append(item)
        sectionItemsSubject.onNext(self.model.content)
    }
}

struct ContentModel {
  
    var content: [ContentSection] = []
}

编辑

struct ContentSection {
    
    var id: String
    var items: [Item]
    var order: Int
}

extension ContentSection: SectionModelType {
    
    typealias Item = ItemCellModel
    
    init(original: ContentSection, items: [ItemCellModel]) {
        self = original
        self.items = items
    }
}

struct ItemCellModel {

    let id: String
    let img: String
   
    
    init(id: String, img: String) {
       self.id = id
       self.img = img
   }
}
4

2 回答 2

1

您的模型可能不符合正确所需的协议,并且差异检查器无法识别它们相同的单元模型,因此它会再次呈现整个集合视图。请参阅相关文档:

''' 支持扩展你的项目和部分结构只需用IdentifiableTypeEquatable扩展你的项目,用 AnimatableSectionModelType 扩展你的部分'''</p>

https://github.com/RxSwiftCommunity/RxDataSources

此外,您可以遵循此示例 - https://bytepace.medium.com/bring-tables-alive-with-rxdatasources-rxswift-part-1-db050fbc2cf6

于 2021-05-06T07:13:12.383 回答
1

CloudBalance 的回答是正确的。您的 ContentSection 类型错误...试试这个:

typealias ContentSection = AnimatableSectionModel<ContentSectionModel, ItemCellModel>

struct ContentSectionModel: IdentifiableType {
    var identity: String
    var order: Int
}

struct ItemCellModel: IdentifiableType, Equatable {
    let identity: String
    let img: String
}
于 2021-05-06T21:30:25.753 回答