Skip to content

DSL to build predicates and requests for CoreData fetching

License

Notifications You must be signed in to change notification settings

ABridoux/SafeFetching

Repository files navigation

SafeFetching

This library offers a DSL (Domain Specific Language) to safely build predicates and requests to fetch a CoreData store. Also a wrapper around NSFetchedResultsController is offered to publish arrays of NSManagedObject to be used with a NSDiffableDataSource.

The documentation is built with docC. You can read it online or locally by running ProductBuild Documentation or hitting ⇧⌃⌘D.

Convenient and safe fetching

For any CoreData entity generated by Xcode, the only required step is to make it implement Fetchable.

final class RandomEntity: NSManagedObject {

    @NSManaged var score = 0.0
    @NSManaged var name: String? = ""
}
extension RandomEntity: Fetchable {}

Then it's possible to use the DSL to build a request. The last step can either get the built request as NSFetchRequest<RandomEntity> or execute the request in the provided context.

RandomEntity.request()
    .all(after: 10)
    .where(\.score >= 15 || \.name != "Joe")
    .sorted(by: .ascending(\.score), .descending(\.name))
    .setting(\.returnsDistinctResults, to: true)
    .nsValue
RandomEntity.request()
    .all(after: 10)
    .where(\.score >= 15 || \.name != "Joe")
    .sorted(by: .ascending(\.score), .descending(\.name))
    .setting(\.returnsDistinctResults, to: true)
    .fetch(in: context) // returns [RandomEntity]

Advanced NSPredicate operators are also available like BEGINSWITH (hasPrefix). To use one, specified a key path followed by *:

RandomEntity.request()
    .all()
    .where(\.name * .hasPrefix("Do"))
    .nsValue

More about that in the documentation.