mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-19 20:25:31 +00:00
Split core data manager into regatta and training managers
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user