JSQDataSourcesKit
Protocol-oriented, type-safe data source objects that keep your view controllers light
A Swift library of data source and delegate objects inspired by Andy Matuschak's type-safe, value-oriented collection view data source gist.
About
This library reduces the boilerplate code regarding the UITableView
, UICollectionView
, and NSFetchedResultsController
data source objects, as well as the NSFetchedResultsControllerDelegate
object. It helps keep view controllers light, while focusing on type-safety, SOLID design principles, and easy interoperability with Cocoa. Further, it brings a more focused and data-driven perspective to these data sources. If you want to change your view then you change your data and its structure, without needing to update any data source or delegate protocol methods.
Requirements
- iOS 8+
- Swift 3.0
- Xcode 8
Installation
CocoaPods (recommended)
use_frameworks!
# For latest release in cocoapods
pod 'JSQDataSourcesKit'
# Feeling adventurous? Get the latest on develop
pod 'JSQDataSourcesKit', :git => 'https://github.com/jessesquires/JSQDataSourcesKit.git', :branch => 'develop'
Carthage
github "jessesquires/JSQDataSourcesKit"
Documentation
Read the docs. Generated with jazzy. Hosted by GitHub Pages.
Generate
$ ./build_docs.sh
Preview
$ open index.html -a Safari
Getting Started
Watch my talk from Swift Summit. (slides)
import JSQDataSourcesKit
Design
This library has four primary components:
Section
— represents a section of dataDataSource
— represents a collection ofSection
typesReusableViewFactory
— responsible for dequeuing and configuring cells (forUITableView
orUICollectionView
)DataSourceProvider
— owns a data source and cell factory, and provides aUICollectionViewDataSource
orUITableViewDataSource
object.
Example
The following illustrates a simple example of how these components interact for a collection view.
// Given a view controller with a collection view
// 1. create Sections and a DataSource with your model objects
let section0 = Section(items: ...)
let section1 = Section(items: ...)
let section2 = Section(items: ...)
let dataSource = DataSource(sections: section0, section1, section2)
// 2. create cell factory
let cellFactory = ViewFactory(reuseIdentifier: "CellId") { (cell, model?, type, collectionView, indexPath) -> MyCellClass in
// configure the cell with the model
return cell
}
// 3. create supplementary view factory
let type = ReusableViewType.supplementaryView(kind: UICollectionElementKindSectionHeader)
let headerFactory = ViewFactory(reuseIdentifier: "HeaderId", type: type) { (view, model?, type, collectionView, indexPath) -> MyHeaderView in
// configure header view
return view
}
// 4. create data source provider
let dataSourceProvider = DataSourceProvider(dataSource: dataSource,
cellFactory: cellFactory,
supplementaryFactory: headerFactory)
// 5. set the collection view's data source
collectionView.dataSource = dataSourceProvider.collectionViewDataSource
Demo Project
The example project included exercises all functionality in this library.
Contribute
Please follow these sweet contribution guidelines.
Credits
Created and maintained by @jesse_squires.
- Inspired by andymatuschak / gist f1e1691fa1a327468f8e
- Inspired by ashfurrow / UICollectionView-NSFetchedResultsController
License
JSQDataSourcesKit
is released under an MIT License. See LICENSE
for details.
Copyright © 2015-present Jesse Squires.
Please provide attribution, it is greatly appreciated.