A swifter Core Data stack
This library aims to do the following:
- Provide better interoperability with Swift
- Harness Swift features and enforce Swift paradigms
- Bring functional paradigms to Core Data
- Simplify the processes of standing up the Core Data stack
- Aid in testing your Core Data models
- Reduce the boilerplate involved with Core Data
Further reading on Core Data:
- Xcode 7.3+
- iOS 8.0+
- OSX 10.10+
- tvOS 9.0+
- watchOS 2.0+
- Swift 2.2+
CocoaPods (recommended)
use_frameworks!
# For latest release in cocoapods
pod 'JSQCoreDataKit'
# Feeling adventurous? Get the latest on develop
pod 'JSQCoreDataKit', :git => 'https://github.com/jessesquires/JSQCoreDataKit.git', :branch => 'develop'github "jessesquires/JSQCoreDataKit"Read the docs. Generated with jazzy. Hosted by GitHub Pages. More information on the gh-pages branch.
import JSQCoreDataKit// Initialize the Core Data model, this class encapsulates the notion of a .xcdatamodeld file
// The name passed here should be the name of an .xcdatamodeld file
let bundle = NSBundle(identifier: "com.MyApp.MyModelFramework")!
let model = CoreDataModel(name: "MyModel", bundle: bundle)
// Initialize a stack with a factory
let factory = CoreDataStackFactory(model: model)
let stack: CoreDataStack?
factory.createStackInBackground { (result: CoreDataStackResult) in
switch result {
case .Success(let s):
stack = s
case .Failure(let e):
print("Error: \(e)")
}
}let inMemoryModel = CoreDataModel(name: myName, bundle: myBundle, storeType: .InMemory)
let factory = CoreDataStackFactory(model: inMemoryModel)
let stack = factory.createStack()saveContext(stack.mainContext) { result in
switch result {
case .Success:
print("save succeeded")
case .Failure(let error):
print("save failed: \(error)")
}
}let bundle = NSBundle(identifier: "com.MyApp.MyModelFramework")!
let model = CoreDataModel(name: "MyModel", bundle: bundle)
do {
try model.removeExistingModelStore()
} catch {
print("Error: \(error)")
}let bundle = NSBundle(identifier: "com.MyApp.MyModelFramework")!
let model = CoreDataModel(name: "MyModel", bundle: bundle)
if model.needsMigration {
do {
try migrate(model)
} catch {
print("Failed to migrate model: \(error)")
}
}// Create a background queue child context from the main queue context
let childContext = stack.childContext()// Create a FetchRequest<T>, where T is a phantom type
let entity = entity(name: "MyModel", context: context)!
let request = FetchRequest<MyModel>(entity: entity)
var results = [MyModel]()
do {
results = try fetch(request: request, inContext: context)
}
catch {
print("Fetch error: \(error)")
}
print("Results = \(results)")let objects: [MyModel] = /* array of MyModel objects */
deleteObjects(objects, inContext: context)
// Commit changes to remove objects from store
saveContext(context)There's an example app in the Example/ directory. Open the ExampleApp.xcodeproj to run it. The project exercises all basic functionality of the library.
There's a suite of unit tests for JSQCoreDataKit.framework. You can run them in the usual way from Xcode by opening JSQCoreDataKit.xcodeproj. 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.
JSQCoreDataKit is released under an MIT License. See LICENSE for details.
Copyright © 2015-present Jesse Squires.
Please provide attribution, it is greatly appreciated.