Split core data manager into regatta and training managers

This commit is contained in:
Raimund Wege
2017-08-21 14:47:05 +02:00
parent f36fac1adc
commit 57a00fba98
14 changed files with 85 additions and 37 deletions
@@ -331,6 +331,8 @@
C8603D511C52892A002B2F28 /* Acknowledgements.markdown in Resources */ = {isa = PBXBuildFile; fileRef = C8603D491C528832002B2F28 /* Acknowledgements.markdown */; };
C867BD091F4B0274007E78E0 /* TrainingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C867BD081F4B0274007E78E0 /* TrainingViewController.swift */; };
C867BD0B1F4B0290007E78E0 /* CreateTrainingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C867BD0A1F4B0290007E78E0 /* CreateTrainingViewController.swift */; };
C867BD0D1F4B0A0E007E78E0 /* RegattaCoreDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C867BD0C1F4B0A0E007E78E0 /* RegattaCoreDataManager.swift */; };
C867BD0F1F4B0A4B007E78E0 /* TrainingCoreDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C867BD0E1F4B0A4B007E78E0 /* TrainingCoreDataManager.swift */; };
C8739E061D2AA2A500A89F3C /* GPSFix+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8739DFC1D2AA2A500A89F3C /* GPSFix+CoreDataProperties.swift */; };
C8739E071D2AA2A500A89F3C /* GPSFix.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8739DFD1D2AA2A500A89F3C /* GPSFix.swift */; };
C8739E081D2AA2A500A89F3C /* Leaderboard+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8739DFE1D2AA2A500A89F3C /* Leaderboard+CoreDataProperties.swift */; };
@@ -727,6 +729,8 @@
C8603D491C528832002B2F28 /* Acknowledgements.markdown */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = Acknowledgements.markdown; sourceTree = "<group>"; };
C867BD081F4B0274007E78E0 /* TrainingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrainingViewController.swift; sourceTree = "<group>"; };
C867BD0A1F4B0290007E78E0 /* CreateTrainingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateTrainingViewController.swift; sourceTree = "<group>"; };
C867BD0C1F4B0A0E007E78E0 /* RegattaCoreDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RegattaCoreDataManager.swift; sourceTree = "<group>"; };
C867BD0E1F4B0A4B007E78E0 /* TrainingCoreDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrainingCoreDataManager.swift; sourceTree = "<group>"; };
C8739D9A1D25317100A89F3C /* CoreData 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "CoreData 2.xcdatamodel"; sourceTree = "<group>"; };
C8739DFC1D2AA2A500A89F3C /* GPSFix+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GPSFix+CoreDataProperties.swift"; sourceTree = "<group>"; };
C8739DFD1D2AA2A500A89F3C /* GPSFix.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GPSFix.swift; sourceTree = "<group>"; };
@@ -862,6 +866,8 @@
C843D47B1EBC54A300250F01 /* MarkCheckIn+CoreDataProperties.swift */,
7F44095919F65B5B0021BF22 /* CoreData.xcdatamodeld */,
C843D48D1EC0999D00250F01 /* Migration */,
C867BD0C1F4B0A0E007E78E0 /* RegattaCoreDataManager.swift */,
C867BD0E1F4B0A4B007E78E0 /* TrainingCoreDataManager.swift */,
);
name = CoreData;
sourceTree = "<group>";
@@ -1967,6 +1973,7 @@
C8F71EE21D8691F700826DE4 /* AFURLSessionManager.m in Sources */,
C843D4821EBC54A300250F01 /* MarkCheckIn.swift in Sources */,
C8F71EDD1D8691F700826DE4 /* AFNetworkReachabilityManager.m in Sources */,
C867BD0D1F4B0A0E007E78E0 /* RegattaCoreDataManager.swift in Sources */,
C843D4801EBC54A300250F01 /* CompetitorCheckIn.swift in Sources */,
C852BAAB1CF736680093B0C5 /* Preferences.swift in Sources */,
C843D48A1EBCADF500250F01 /* MarkSessionController.swift in Sources */,
@@ -1980,6 +1987,7 @@
7F193A8F1A39ACF500D71773 /* TimerViewController.swift in Sources */,
C8739E181D2BF2DC00A89F3C /* BaseData.swift in Sources */,
7F83F15619F154F000C53328 /* AppDelegate.swift in Sources */,
C867BD0F1F4B0A4B007E78E0 /* TrainingCoreDataManager.swift in Sources */,
C8B3B9C21F3C6B3900B3B6BA /* SignUpTranslation.swift in Sources */,
7F950A911A35E967003C8C5C /* LeaderboardViewController.swift in Sources */,
C8F71EED1D8691F700826DE4 /* UIImageView+AFNetworking.m in Sources */,
@@ -18,7 +18,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
logInfo(name: "\(#function)", info: "Background fetch started...")
var noData = true
var allSuccess = true
if let checkIns = CoreDataManager.sharedManager.fetchCheckIns() {
if let checkIns = RegattaCoreDataManager.shared.fetchCheckIns() {
checkIns.forEach({ (checkIn) in
if let gpsFixes = checkIn.gpsFixes {
if gpsFixes.count > 0 {
@@ -54,7 +54,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
CoreDataManager.sharedManager.saveContext()
RegattaCoreDataManager.shared.saveContext()
}
func applicationWillEnterForeground(_ application: UIApplication) {
@@ -67,7 +67,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
CoreDataManager.sharedManager.saveContext()
RegattaCoreDataManager.shared.saveContext()
}
// MARK: - Setup
@@ -91,7 +91,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
}
fileprivate func setupCoreData() {
_ = CoreDataManager.sharedManager // Initialize core data, migrate database if needed, or delete if migration needed but not possible
_ = RegattaCoreDataManager.shared // Initialize core data, migrate database if needed, or delete if migration needed but not possible
}
fileprivate func setupNavigationBarApperance() {
@@ -13,8 +13,8 @@ import CoreData
class CheckIn: NSManagedObject {
func initialize() {
event = CoreDataManager.sharedManager.newEvent(checkIn: self)
leaderboard = CoreDataManager.sharedManager.newLeaderboard(checkIn: self)
event = RegattaCoreDataManager.shared.newEvent(checkIn: self)
leaderboard = RegattaCoreDataManager.shared.newLeaderboard(checkIn: self)
}
func updateWithCheckInData(checkInData: CheckInData) {
@@ -92,23 +92,23 @@ class CheckInController : NSObject {
fileprivate func postCheckInSuccess(checkInData: CheckInData, completion: (_ withSuccess: Bool) -> Void) {
switch checkInData.type {
case .competitor:
let competitorCheckIn = CoreDataManager.sharedManager.fetchCompetitorCheckIn(
let competitorCheckIn = RegattaCoreDataManager.shared.fetchCompetitorCheckIn(
eventID: checkInData.eventID,
leaderboardName: checkInData.leaderboardName,
competitorID: checkInData.competitorID!
) ?? CoreDataManager.sharedManager.newCompetitorCheckIn()
) ?? RegattaCoreDataManager.shared.newCompetitorCheckIn()
competitorCheckIn.updateWithCheckInData(checkInData: checkInData)
CoreDataManager.sharedManager.saveContext()
RegattaCoreDataManager.shared.saveContext()
checkInDidFinish(withSuccess: true, completion: completion)
break
case .mark:
let markCheckIn = CoreDataManager.sharedManager.fetchMarkCheckIn(
let markCheckIn = RegattaCoreDataManager.shared.fetchMarkCheckIn(
eventID: checkInData.eventID,
leaderboardName: checkInData.leaderboardName,
markID: checkInData.markID!
) ?? CoreDataManager.sharedManager.newMarkCheckIn()
) ?? RegattaCoreDataManager.shared.newMarkCheckIn()
markCheckIn.updateWithCheckInData(checkInData: checkInData)
CoreDataManager.sharedManager.saveContext()
RegattaCoreDataManager.shared.saveContext()
checkInDidFinish(withSuccess: true, completion: completion)
break
}
@@ -8,7 +8,7 @@
import Foundation
open class CheckInData: NSObject {
class CheckInData: NSObject {
fileprivate struct ItemNames {
static let EventID = "event_id"
@@ -173,7 +173,7 @@ class CompetitorViewController : SessionViewController, UINavigationControllerDe
teamImageView.image = image
competitorCheckIn.teamImageRetry = false
competitorCheckIn.teamImageData = UIImageJPEGRepresentation(image, 0.8)
CoreDataManager.sharedManager.saveContext()
RegattaCoreDataManager.shared.saveContext()
success()
}
@@ -329,7 +329,7 @@ extension CompetitorViewController: UIImagePickerControllerDelegate {
fileprivate func pickedImage(image: UIImage) {
teamImageView.image = image
competitorCheckIn.teamImageData = UIImageJPEGRepresentation(image, 0.8)
CoreDataManager.sharedManager.saveContext()
RegattaCoreDataManager.shared.saveContext()
if let data = competitorCheckIn.teamImageData {
uploadTeamImageData(imageData: data)
}
@@ -354,13 +354,13 @@ extension CompetitorViewController: UIImagePickerControllerDelegate {
fileprivate func uploadTeamImageDataSuccess(teamImageURL: String) {
competitorCheckIn.teamImageRetry = false
competitorCheckIn.teamImageURL = teamImageURL
CoreDataManager.sharedManager.saveContext()
RegattaCoreDataManager.shared.saveContext()
refreshTeamImage()
}
fileprivate func uploadTeamImageDataFailure(error: Error) {
competitorCheckIn.teamImageRetry = true
CoreDataManager.sharedManager.saveContext()
RegattaCoreDataManager.shared.saveContext()
showUploadTeamImageFailureAlert(error: error)
refreshTeamImage()
}
@@ -391,8 +391,8 @@ extension CompetitorViewController: SessionViewControllerDelegate {
}
fileprivate func performCheckOutCompleted(withSuccess: Bool) {
CoreDataManager.sharedManager.deleteObject(object: competitorCheckIn)
CoreDataManager.sharedManager.saveContext()
RegattaCoreDataManager.shared.deleteObject(object: competitorCheckIn)
RegattaCoreDataManager.shared.saveContext()
self.navigationController!.popViewController(animated: true)
}
@@ -9,7 +9,7 @@
import Foundation
import CoreData
open class CoreDataManager: NSObject {
class CoreDataManager: NSObject {
fileprivate enum Entities: String {
case CheckIn
@@ -20,11 +20,11 @@ open class CoreDataManager: NSObject {
case MarkCheckIn
}
open class var sharedManager: CoreDataManager {
struct Singleton {
static let sharedManager = CoreDataManager()
}
return Singleton.sharedManager
let name: String
init(name: String) {
self.name = name
super.init()
}
// MARK: - Fetch
@@ -173,7 +173,7 @@ open class CoreDataManager: NSObject {
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.appendingPathComponent("CoreData.sqlite")
let url = self.applicationDocumentsDirectory.appendingPathComponent("\(self.name).sqlite")
let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]
do {
logInfo(name: "\(#function)", info: "Connecting to database...")
@@ -127,8 +127,8 @@ class GPSFixController: NSObject {
DispatchQueue.main.async(execute: {
self.log(info: "Sending \(gpsFixes.count) GPS fixes was successful")
self.postModeChangedNotification(mode: BatteryManager.sharedManager.batterySaving ? .BatterySaving : .Online)
CoreDataManager.sharedManager.deleteObjects(objects: gpsFixes)
CoreDataManager.sharedManager.saveContext()
RegattaCoreDataManager.shared.deleteObjects(objects: gpsFixes)
RegattaCoreDataManager.shared.saveContext()
self.log(info: "\(gpsFixes.count) GPS fixes deleted")
success(gpsFixesLeft)
})
@@ -190,7 +190,7 @@ class HomeViewController: UIViewController {
fileprivate func reviewGPSFixes(completion: @escaping () -> Void) {
SVProgressHUD.show()
fetchedResultsController.delegate = nil
let checkIns = CoreDataManager.sharedManager.fetchCheckIns() ?? []
let checkIns = RegattaCoreDataManager.shared.fetchCheckIns() ?? []
reviewGPSFixes(checkIns: checkIns) {
self.reviewGPSFixesCompleted(completion: completion)
}
@@ -217,7 +217,7 @@ class HomeViewController: UIViewController {
guard let checkInData = CheckInData(urlString: urlString) else { completion(); return }
checkInController.checkIn(checkInData: checkInData, completion: { (withSuccess) in
Preferences.newCheckInURL = nil
self.selectedCheckIn = CoreDataManager.sharedManager.fetchCheckIn(checkInData: checkInData)
self.selectedCheckIn = RegattaCoreDataManager.shared.fetchCheckIn(checkInData: checkInData)
completion()
})
}
@@ -361,7 +361,7 @@ class HomeViewController: UIViewController {
}()
fileprivate lazy var fetchedResultsController: NSFetchedResultsController<CheckIn> = {
let fetchedResultsController = CoreDataManager.sharedManager.checkInFetchedResultsController()
let fetchedResultsController = RegattaCoreDataManager.shared.checkInFetchedResultsController()
fetchedResultsController.delegate = self
return fetchedResultsController
}()
@@ -121,8 +121,8 @@ extension MarkViewController: SessionViewControllerDelegate {
}
fileprivate func performCheckOutCompleted(withSuccess: Bool) {
CoreDataManager.sharedManager.deleteObject(object: markCheckIn)
CoreDataManager.sharedManager.saveContext()
RegattaCoreDataManager.shared.deleteObject(object: markCheckIn)
RegattaCoreDataManager.shared.saveContext()
self.navigationController!.popViewController(animated: true)
}
@@ -0,0 +1,20 @@
//
// RegattaCoreDataManager.swift
// SAPTracker
//
// Created by Raimund Wege on 21.08.17.
// Copyright © 2017 com.sap.sailing. All rights reserved.
//
import UIKit
class RegattaCoreDataManager: CoreDataManager {
class var shared: CoreDataManager {
struct Singleton {
static let shared = RegattaCoreDataManager(name: "CoreData")
}
return Singleton.shared
}
}
@@ -193,7 +193,7 @@ extension ScanViewController: AVCaptureMetadataOutputObjectsDelegate {
fileprivate func captureOutputSuccess(checkInData: CheckInData) {
checkInController.checkIn(checkInData: checkInData, completion: { (withSuccess) in
if withSuccess {
self.homeViewController?.selectedCheckIn = CoreDataManager.sharedManager.fetchCheckIn(checkInData: checkInData)
self.homeViewController?.selectedCheckIn = RegattaCoreDataManager.shared.fetchCheckIn(checkInData: checkInData)
_ = self.navigationController?.popViewController(animated: true)
} else {
self.startScanning()
@@ -53,9 +53,9 @@ class SessionController: NSObject {
guard self.isTracking else { return }
guard let locationData = notification.userInfo?[LocationManager.UserInfo.LocationData] as? LocationData else { return }
guard locationData.isValid else { return }
let gpsFix = CoreDataManager.sharedManager.newGPSFix(checkIn: self.checkIn)
let gpsFix = RegattaCoreDataManager.shared.newGPSFix(checkIn: self.checkIn)
gpsFix.updateWithLocationData(locationData: locationData)
CoreDataManager.sharedManager.saveContext()
RegattaCoreDataManager.shared.saveContext()
if self.sendingDate.compare(Date()) == .orderedAscending {
self.sendingDate = Date().addingTimeInterval(BatteryManager.sharedManager.sendingPeriod)
self.beginGPSFixSendingInBackgroundTask()
@@ -105,7 +105,7 @@ class SessionController: NSObject {
checkIn.event.updateWithEventData(eventData: checkInData.eventData)
checkIn.leaderboard.updateWithLeaderboardData(leaderboardData: checkInData.leaderboardData)
checkIn.updateWithCheckInData(checkInData: checkInData)
CoreDataManager.sharedManager.saveContext()
RegattaCoreDataManager.shared.saveContext()
completion()
}
@@ -0,0 +1,20 @@
//
// TrainingCoreDataManager.swift
// SAPTracker
//
// Created by Raimund Wege on 21.08.17.
// Copyright © 2017 com.sap.sailing. All rights reserved.
//
import UIKit
class TrainingCoreDataManager: CoreDataManager {
class var shared: CoreDataManager {
struct Singleton {
static let shared = RegattaCoreDataManager(name: "TrainingCoreData")
}
return Singleton.shared
}
}