XRepository is based on QBRepository by QuickBirds Studios. It is lightweight implementation of Repository pattern in Swift.
?? Getting started
Cornerstone of this project is Repository
protocol.
protocol Repository {
associatedtype Model
func getAll() -> AnyRandomAccessCollection<Model>
func getElement<Id>(withId id: Id) -> Model?
func getElements(filteredBy filter: Query<Model>?, sortedBy sortKeyPath: ComparableKeyPath<Model>?, distinctUsing distinctMode: HashableKeyPath<Model>?) -> AnyRandomAccessCollection<Model>
func create(_ model: Model) -> RepositoryEditResult<Model>
func create(_ models: [Model]) -> RepositoryEditResult<[Model]>
func update(_ model: Model) -> RepositoryEditResult<Model>
func delete(_ model: Model) -> Error?
func delete(_ models: [Model]) -> Error?
func deleteAll() -> Error?
func performTranscation(_ transaction: () -> Void) -> Error?
}
Than you have AnyRepository
class to abstragate implementation of Repository
from its consumers. AnyRepository
has the same semantic as its interface.
final class AnyRepository<Model>: Repository {
...
init <A: Repository>(_ repository: A) where A.Model == Model { ... }
...
}
? Usage
XRepository provides implementations for popular storages from-the-box:
UserDefaultRepository
, RealmRepository
, FileSystemRepository
, but you can create your own implementation.
Usage is simple:
class ChurchesViewModel {
...
let churchesRepository: AnyRepository<Church>
...
}
let churchesStorage = AnyRepository(UserDefaultsRepository<Church>())
let churchesViewModel = ChurchesViewModel(churchesRepository: churchesStorage)
⚡️ Rx
XRepository supports reactive wrapper over AnyRepository
extension AnyRepository {
var rx: RxRepository<Model> {
return RxRepository(self)
}
}
class RxRepository<Model> {
let base: AnyRepository<Model>
init(_ base: AnyRepository<Model>) {
self.base = base
}
func getAll() -> Single<AnyRandomAccessCollection<Model>> {
return Single.create(subscribe: { single -> Disposable in
let models = self.base.getAll()
single(.success(models))
return Disposables.create()
})
}
....
}
If you want a pure reactive repository implementations for popular storages, check my latest project: ReactiveXRepository
? Author
This framework is created by Sashko Potapov.
? License
XCoordinator is released under an MIT license. See License.md for more information.