taketin / Barrel

Type-safe CoreData library for Swift.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Barrel

A simple type-safe CoreData library for Swift.

##Installation

platform :ios, "8.0"
use_frameworks!

pod 'Barrel', :git => 'https://github.com/tarunon/Barrel.git'

##Summary

Swift is a type-safe programing language and supported type-inference.

Before

func findPerson(age: Int) -> [Person] {
  let fetchRequest = NSFetchRequest(entityName: "Person")
  fetchRequest.predicate = NSPredicate(format: "age == %i", age)
  fetchRequest.sortDescriptor = [NSSortDescriptor(key: "name", ascending: true)]
  return context.executeFetchRequest(fetchRequest, error: nil) as? [Person] ?? []
}

func createPerson(name: String, age: Int) -> Person {
  let person = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: context) as! T
  person.name = name
  person.age = age
  return person
}

After

func findPerson(age: Int) -> [Person] {
  return context.fetch()
    .filter{ $0.age == age }
    .orderBy{ $0.name < $1.name }
    .execute().all()
}

func createPerson(name: String, age: Int) -> Person {
  return context.insert().setValues{
    $0.name = name
    $0.age = age
    }.insert()
}

##Fetch

Barrel provides fetch methods.

###Type-safe Barrel's fetch method is type-safe.

let persons = context.fetch(Person).execute().all()

If the type is defined, fetch's argument can be omitted.

let persons: [Person] = context.fetch().execute().all()

###Enum value A result of Barrel's fetch is Enum value Array or NSError.

let personsResult = context.fetch(Person).execute()
switch personsResult {
case .Succeed(let persons):
    // case of Array of Person
case .Failed(let error):
    // case of NSError
}

###Method chaining Barrel is defined condition of fetch using method chaining.

let persons = context.fetch(Person)
  .filter(NSPredicate(format: "name == %@", "John"))
  .orderBy(NSSortDescriptor(key: "age", ascending: true))
  .execute().all()

###Closure Barrel can be defined condition of fetch using closure.

let persons = context.fetch(Person)
  .filter{ $0.name == "John" }
  .orderBy{ $0.age < $1.age }
  .execute().all()

##Insert

Barrel provides insert methods. Type-safe and Closure support.

let person = context.insert(Person).setValues{
  $0.name = "John"
  $0.age = 24
  }.insert()

And support getOrInsert method.

let person = context.insert(Person).setValues{
  $0.name = "John"
  $0.age = 24
  }.getOrInsert()

##Others

Barrel has more functions.

###Aggregate and Grouping

Support aggregate method,

let maxAge = context.fetch(Person)
  .aggregate{ $0.max($1.age) }
  .execute().get()!
// maxAge => ["maxAge": XX]

and grouping.

let maxAgePerName = context.fetch(Person)
  .aggregate{ $0.max($1.age) }
  .aggregate{ $1.name }
  .groupBy{ $1.name }
  .execute().all()
// maxAgePerName => [["maxAge" : XX, "name": "YY"], ...]

###ResultsController NSFetchResultsController is not also type-safe. Barrel supports Type-safe ResultsController object.

let resultsController: ResultsController<Person> = context.fetch(Person)
  .orderBy{ $0.age < $1.age }
  .resultsController(sectionKeyPath: nil, cacheName: nil)
let person = resultsController.objectAtIndexPath(NSIndexPath(forRow: 0, inSection: 0))

About

Type-safe CoreData library for Swift.

License:MIT License


Languages

Language:Swift 98.1%Language:Ruby 1.0%Language:C++ 0.9%