Implemented the Service protocol in the Persistence library and conformed the PersistenceService service to it.

This commit is contained in:
Javier Cicchelli 2023-04-13 14:12:27 +02:00
parent 2b38e03094
commit f79b2bd473
6 changed files with 56 additions and 18 deletions

View File

@ -0,0 +1,36 @@
//
// Service.swift
// Persistence
//
// Created by Javier Cicchelli on 13/04/2023.
// Copyright © 2023 Röck+Cöde. All rights reserved.
//
import CoreData
public protocol Service {
// MARK: Properties
/// The main managed object context.
var viewContext: NSManagedObjectContext { get }
// MARK: Functions
/// Create a private queue context.
/// - Returns: A concurrent `NSManagedObjectContext` context instance ready to use.
func makeTaskContext() -> NSManagedObjectContext
/// Create a child context of the view context.
/// - Returns: A generated child `NSManagedObjectContext` context instance ready to use.
func makeChildContext() -> NSManagedObjectContext
/// Save a given context,
/// - Parameter context: A `NSManagedObjectContext` context instance to save.
func save(context: NSManagedObjectContext)
/// Save a given child context as well as its respective parent context.
/// - Parameter context: A child `NSManagedObjectContext` context instance to save.
func save(childContext context: NSManagedObjectContext)
}

View File

@ -35,10 +35,18 @@ public struct PersistenceService {
setContainer(inMemory)
}
}
// MARK: - Service
extension PersistenceService: Service {
// MARK: Properties
public var viewContext: NSManagedObjectContext { container.viewContext }
// MARK: Functions
/// Create a private queue context.
/// - Returns: A concurrent `NSManagedObjectContext` context instance ready to use.
public func makeTaskContext() -> NSManagedObjectContext {
let taskContext = container.newBackgroundContext()
@ -48,8 +56,6 @@ public struct PersistenceService {
return taskContext
}
/// Create a child context of the view context.
/// - Returns: A generated child `NSManagedObjectContext` context instance ready to use.
public func makeChildContext() -> NSManagedObjectContext {
let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
@ -60,8 +66,6 @@ public struct PersistenceService {
return context
}
/// Save a given context,
/// - Parameter context: A `NSManagedObjectContext` context instance to save.
public func save(context: NSManagedObjectContext) {
guard context.hasChanges else {
return
@ -75,8 +79,6 @@ public struct PersistenceService {
}
}
/// Save a given child context as well as its respective parent context.
/// - Parameter context: A child `NSManagedObjectContext` context instance to save.
public func save(childContext context: NSManagedObjectContext) {
guard context.hasChanges else {
return

View File

@ -13,7 +13,7 @@ import Remote
// MARK: - DependencyService+Keys
extension DependencyService {
var persistence: PersistenceService {
var persistence: Persistence.Service {
get { Self[PersistenceKey.self] }
set { Self[PersistenceKey.self] = newValue }
}
@ -27,7 +27,7 @@ extension DependencyService {
// MARK: - Dependency keys
struct PersistenceKey: DependencyKey {
static var currentValue: PersistenceService = .shared
static var currentValue: Persistence.Service = PersistenceService.shared
}
struct RemoteKey: DependencyKey {

View File

@ -21,7 +21,7 @@ class LocationsListViewModel: ObservableObject {
weak var coordinator: LocationsListCoordination?
private lazy var locationProvider = LocationProvider(managedContext: persistence.container.viewContext)
private lazy var locationProvider = LocationProvider(managedContext: persistence.viewContext)
@Published private var viewStatus: LocationsListViewStatus = .initialised

View File

@ -15,13 +15,13 @@ struct LoadRemoteLocationsUseCase {
// MARK: Properties
private let persistence: PersistenceService
private let persistence: Persistence.Service
private let remoteService: Remote.Service
// MARK: Initialisers
init(
persistence: PersistenceService,
persistence: Persistence.Service,
remoteService: Remote.Service
) {
self.persistence = persistence

View File

@ -13,11 +13,11 @@ struct SaveLocalLocationUseCase {
// MARK: Properties
private let persistence: PersistenceService
private let persistence: Persistence.Service
// MARK: Initialisers
init(persistence: PersistenceService) {
init(persistence: Persistence.Service) {
self.persistence = persistence
}