RxSwift/RxCocoa/iOS/DataSources/RxCollectionViewReactiveArrayDataSource.swift
2016-02-13 22:12:50 +01:00

108 lines
3.3 KiB
Swift

//
// RxCollectionViewReactiveArrayDataSource.swift
// RxCocoa
//
// Created by Krunoslav Zaher on 6/29/15.
// Copyright © 2015 Krunoslav Zaher. All rights reserved.
//
#if os(iOS) || os(tvOS)
import Foundation
import UIKit
#if !RX_NO_MODULE
import RxSwift
#endif
// objc monkey business
class _RxCollectionViewReactiveArrayDataSource
: NSObject
, UICollectionViewDataSource {
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
func _collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 0
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return _collectionView(collectionView, numberOfItemsInSection: section)
}
func _collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
rxAbstractMethod()
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
return _collectionView(collectionView, cellForItemAtIndexPath: indexPath)
}
}
class RxCollectionViewReactiveArrayDataSourceSequenceWrapper<S: SequenceType>
: RxCollectionViewReactiveArrayDataSource<S.Generator.Element>
, RxCollectionViewDataSourceType {
typealias Element = S
override init(cellFactory: CellFactory) {
super.init(cellFactory: cellFactory)
}
func collectionView(collectionView: UICollectionView, observedEvent: Event<S>) {
UIBindingObserver(UIElement: self) { collectionViewDataSource, sectionModels in
let sections = Array(sectionModels)
collectionViewDataSource.collectionView(collectionView, observedElements: sections)
}.on(observedEvent)
}
}
// Please take a look at `DelegateProxyType.swift`
class RxCollectionViewReactiveArrayDataSource<Element>
: _RxCollectionViewReactiveArrayDataSource
, SectionedViewDataSourceType {
typealias CellFactory = (UICollectionView, Int, Element) -> UICollectionViewCell
var itemModels: [Element]? = nil
func modelAtIndex(index: Int) -> Element? {
return itemModels?[index]
}
func modelAtIndexPath(indexPath: NSIndexPath) throws -> Any {
precondition(indexPath.section == 0)
guard let item = itemModels?[indexPath.item] else {
throw RxCocoaError.ItemsNotYetBound(object: self)
}
return item
}
var cellFactory: CellFactory
init(cellFactory: CellFactory) {
self.cellFactory = cellFactory
}
// data source
override func _collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return itemModels?.count ?? 0
}
override func _collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
return cellFactory(collectionView, indexPath.item, itemModels![indexPath.item])
}
// reactive
func collectionView(collectionView: UICollectionView, observedElements: [Element]) {
self.itemModels = observedElements
collectionView.reloadData()
}
}
#endif