Last active
August 29, 2015 14:06
-
-
Save danthorpe/47c4c383b846aab7da91 to your computer and use it in GitHub Desktop.
Using YapDatabase Views & Mappings with Swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extension YapDatabaseView { | |
public enum Grouping { | |
case ByKey(YapDatabaseViewGroupingWithKeyBlock) | |
case ByObject(YapDatabaseViewGroupingWithObjectBlock) | |
case ByMetadata(YapDatabaseViewGroupingWithMetadataBlock) | |
case ByRow(YapDatabaseViewGroupingWithRowBlock) | |
var object: YapDatabaseViewGrouping { | |
get { | |
switch self { | |
case .ByKey(let block): | |
return YapDatabaseViewGrouping.withKeyBlock(block) | |
case .ByObject(let block): | |
return YapDatabaseViewGrouping.withObjectBlock(block) | |
case .ByMetadata(let block): | |
return YapDatabaseViewGrouping.withMetadataBlock(block) | |
case .ByRow(let block): | |
return YapDatabaseViewGrouping.withRowBlock(block) | |
} | |
} | |
} | |
} | |
public enum Sorting { | |
case ByKey(YapDatabaseViewSortingWithKeyBlock) | |
case ByObject(YapDatabaseViewSortingWithObjectBlock) | |
case ByMetadata(YapDatabaseViewSortingWithMetadataBlock) | |
case ByRow(YapDatabaseViewSortingWithRowBlock) | |
var object: YapDatabaseViewSorting { | |
get { | |
switch self { | |
case .ByKey(let block): | |
return YapDatabaseViewSorting.withKeyBlock(block) | |
case .ByObject(let block): | |
return YapDatabaseViewSorting.withObjectBlock(block) | |
case .ByMetadata(let block): | |
return YapDatabaseViewSorting.withMetadataBlock(block) | |
case .ByRow(let block): | |
return YapDatabaseViewSorting.withRowBlock(block) | |
} | |
} | |
} | |
} | |
} | |
extension YapDatabaseViewMappings { | |
typealias DisplayChangeSet = (sections: [YapDatabaseViewSectionChange], items: [YapDatabaseViewRowChange]) | |
class func passThroughFilter() -> YapDatabaseViewMappingGroupFilter { | |
return { (group, transaction) -> Bool in | |
return true | |
} | |
} | |
class func defaultSorter() -> YapDatabaseViewMappingGroupSort { | |
return { (group1, group2, transaction) -> NSComparisonResult in | |
return group1.caseInsensitiveCompare(group2) | |
} | |
} | |
} | |
public class PersistedDataSource: NSObject { | |
typealias GroupFilter = YapDatabaseViewMappingGroupFilter | |
typealias GroupSorter = YapDatabaseViewMappingGroupSort | |
let name: String | |
let database: YapDatabase | |
let view: YapDatabaseView | |
let mappings: YapDatabaseViewMappings | |
let readOnlyConnection: YapDatabaseConnection | |
init(name _name: String, database _database: YapDatabase, grouping: YapDatabaseView.Grouping, sorting: YapDatabaseView.Sorting, filter: GroupFilter = YapDatabaseViewMappings.passThroughFilter(), sorter: GroupSorter = YapDatabaseViewMappings.defaultSorter()) { | |
name = _name | |
database = _database | |
view = YapDatabaseView(grouping: grouping.object, sorting: sorting.object) | |
database.registerExtension(view, withName: name) | |
readOnlyConnection = database.newConnection() | |
mappings = YapDatabaseViewMappings(groupFilterBlock: filter, sortBlock: sorter, view: name) | |
super.init() | |
readOnlyConnection.beginLongLivedReadTransaction() | |
readOnlyConnection.readWithBlock { [weak self] (transaction) -> Void in | |
self!.mappings.updateWithTransaction(transaction) | |
} | |
} | |
// Implement UICollectionViewDataSource and UITableViewDataSource in extensions or whatever. | |
} | |
let grouping: YapDatabaseView.Grouping = .ByObject({ (collection, key, object) -> String! in | |
return (collection == Participant.collectionName()) ? "Contacts" : nil | |
}) | |
let sorting: YapDatabaseView.Sorting = .ByObject({ (group, collection1, key1, object1, collection2, key2, object2) -> NSComparisonResult in | |
return .OrderedAscending | |
}) | |
dataSource = PersistedDataSource<Participant>(name: name, database: database, grouping:grouping, sorting:sorting) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment