Type-safe, value-oriented, composable 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.
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.
- iOS 8+
- Swift 2.0+
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'
github "jessesquires/JSQDataSourcesKit"
Read the docs. Generated with jazzy. Hosted by GitHub Pages.
More information on the gh-pages
branch.
import JSQDataSourcesKit
This library is composed of different data source and delegate Provider
classes. Instances of a Provider
own a collection of model objects and a cell factory, and are responsible for providing a data source or delegate.
Read the blog post for more details! (written after the 3.0 release)
The following illustrates a simple example of how these components interact for a table view. Using a collection view follows similarly.
// Given a view controller with a table view
// 1. register cells
let nib = UINib(nibName: "MyCellNib", bundle: nil)
tableView.registerNib(nib, forCellReuseIdentifier: "MyCellIdentifier")
// 2. create sections with your model objects
let section0 = TableViewSection(items: /* items of type T */)
let section1 = TableViewSection(items: /* items of type T */)
let allSections = [section0, section1]
// 3. create cell factory
let factory = TableViewCellFactory(reuseIdentifier: "MyCellIdentifier") { (cell, model, tableView, indexPath) -> UITableViewCell in
// configure the cell
return cell
}
// 4. create data source provider
let dataSourceProvider = TableViewDataSourceProvider(sections: allSections, cellFactory: factory)
// 5. set the table view's data source
tableView.dataSource = dataSourceProvider.dataSource
The example app included exercises all functionality in this library. Open JSQDataSourcesKit.xcworkspace
, select the Example
scheme, then build and run.
There's a suite of unit tests for the JSQDataSourcesKit.framework
. To run them, open JSQDataSourcesKit.xcworkspace
, select the JSQDataSourcesKit
scheme, then ⌘-u.
These tests are well commented and serve as further documentation for how to use this library.
Please follow these sweet contribution guidelines.
Created and maintained by @jesse_squires.
- Inspired by andymatuschak / gist f1e1691fa1a327468f8e
- Inspired by ashfurrow / UICollectionView-NSFetchedResultsController
JSQDataSourcesKit
is released under an MIT License. See LICENSE
for details.
Copyright © 2015-present Jesse Squires.
Please provide attribution, it is greatly appreciated.