From ea2e1df8bb4bd18abfbf181a0553098bfd1090af Mon Sep 17 00:00:00 2001 From: Vincent Neo <23420208+vincentneo@users.noreply.github.com> Date: Fri, 3 Jan 2020 13:07:37 +0800 Subject: [PATCH 1/3] attempt to fix issue #151 --- OpenGpxTracker.xcodeproj/project.pbxproj | 4 + OpenGpxTracker/CoreDataHelper.swift | 115 +++++++++++++++++--- OpenGpxTracker/GPXMapView.swift | 2 +- OpenGpxTracker/GPXSession.swift | 2 +- OpenGpxTracker/GPXWaypoint+Comparison.swift | 28 +++++ OpenGpxTracker/ViewController.swift | 5 +- 6 files changed, 136 insertions(+), 20 deletions(-) create mode 100644 OpenGpxTracker/GPXWaypoint+Comparison.swift diff --git a/OpenGpxTracker.xcodeproj/project.pbxproj b/OpenGpxTracker.xcodeproj/project.pbxproj index 7f627a51..f69182a3 100644 --- a/OpenGpxTracker.xcodeproj/project.pbxproj +++ b/OpenGpxTracker.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 120DE71022B274910055C4CB /* GPXSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 120DE70F22B274910055C4CB /* GPXSession.swift */; }; 120DE71122B274A40055C4CB /* GPXSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 120DE70F22B274910055C4CB /* GPXSession.swift */; }; + 12534A5823BDC4FA00D6CE0A /* GPXWaypoint+Comparison.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12534A5723BDC4FA00D6CE0A /* GPXWaypoint+Comparison.swift */; }; 4588D66B230D23AA009AA75F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4588D66D230D23AA009AA75F /* InfoPlist.strings */; }; 4588D66F230D2476009AA75F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4588D671230D2476009AA75F /* InfoPlist.strings */; }; 45A430E9230D61240003C2F2 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 45A430EB230D61240003C2F2 /* Interface.storyboard */; }; @@ -137,6 +138,7 @@ /* Begin PBXFileReference section */ 120DE70F22B274910055C4CB /* GPXSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GPXSession.swift; sourceTree = ""; }; + 12534A5723BDC4FA00D6CE0A /* GPXWaypoint+Comparison.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GPXWaypoint+Comparison.swift"; sourceTree = ""; }; 3C3088B74A230AB1FD234D6F /* Pods_OpenGpxTracker_Watch.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_OpenGpxTracker_Watch.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 44E786790A477838358F948C /* Pods-OpenGpxTracker.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OpenGpxTracker.debug.xcconfig"; path = "Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker.debug.xcconfig"; sourceTree = ""; }; 455F78BD230AA9D6003705F3 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/LaunchScreen.strings; sourceTree = ""; }; @@ -288,6 +290,7 @@ BF6408A2225C63E700BB5242 /* CoreDataHelper.swift */, BF214B5D22E60B64000E96AA /* CLActivityType+Info.swift */, BF15092123916FC100F51F1B /* UIColor+DarkMode.swift */, + 12534A5723BDC4FA00D6CE0A /* GPXWaypoint+Comparison.swift */, ); name = Models; sourceTree = ""; @@ -776,6 +779,7 @@ 893BEC8619C7E62200C77354 /* GPXWaypoint+MKAnnotation.swift in Sources */, DC4908A31C4A332E009484AE /* MapViewDelegate.swift in Sources */, 898EED3619C6402900B4B207 /* GPXFilesTableViewController.swift in Sources */, + 12534A5823BDC4FA00D6CE0A /* GPXWaypoint+Comparison.swift in Sources */, DC4908A11C4A136F009484AE /* TrackerButton.swift in Sources */, 89F8749F1BBCB97F004EF41A /* GPXRoot+length.swift in Sources */, ); diff --git a/OpenGpxTracker/CoreDataHelper.swift b/OpenGpxTracker/CoreDataHelper.swift index 8fb074ca..e21487ee 100644 --- a/OpenGpxTracker/CoreDataHelper.swift +++ b/OpenGpxTracker/CoreDataHelper.swift @@ -481,7 +481,7 @@ class CoreDataHelper { /// Delete all trackpoints and waypoints in Core Data. - func deleteAllPointsFromCoreData() { + func deleteAllTrackFromCoreData() { let privateManagedObjectContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) privateManagedObjectContext.parent = appDelegate.managedObjectContext @@ -490,18 +490,14 @@ class CoreDataHelper { // Creates fetch requests for both trackpoint and waypoint let trackpointFetchRequest = NSFetchRequest(entityName: "CDTrackpoint") - let waypointFetchRequest = NSFetchRequest(entityName: "CDWaypoint") if #available(iOS 9.0, *) { privateManagedObjectContext.perform { do { let trackpointDeleteRequest = NSBatchDeleteRequest(fetchRequest: trackpointFetchRequest) - let waypointDeleteRequest = NSBatchDeleteRequest(fetchRequest: waypointFetchRequest) // execute both delete requests. try privateManagedObjectContext.execute(trackpointDeleteRequest) - try privateManagedObjectContext.execute(waypointDeleteRequest) - try privateManagedObjectContext.save() self.appDelegate.managedObjectContext.performAndWait { @@ -530,6 +526,64 @@ class CoreDataHelper { } } + do { + // Executes all delete requests + try privateManagedObjectContext.execute(trackpointAsynchronousFetchRequest) + try privateManagedObjectContext.save() + self.appDelegate.managedObjectContext.performAndWait { + do { + // Saves the changes from the child to the main context to be applied properly + try self.appDelegate.managedObjectContext.save() + } catch { + print("Failure to save context after delete: \(error)") + } + } + + } catch let error { + print("NSAsynchronousFetchRequest (for batch delete (entityName: "CDWaypoint") + + if #available(iOS 9.0, *) { + privateManagedObjectContext.perform { + do { + let waypointDeleteRequest = NSBatchDeleteRequest(fetchRequest: waypointFetchRequest) + + // execute both delete requests. + try privateManagedObjectContext.execute(waypointDeleteRequest) + + try privateManagedObjectContext.save() + + self.appDelegate.managedObjectContext.performAndWait { + do { + // Saves the changes from the child to the main context to be applied properly + try self.appDelegate.managedObjectContext.save() + } catch { + print("Failure to save context after delete: \(error)") + } + } + } + catch { + print("Failed to delete all from core data, error: \(error)") + } + + } + + } + else { // for pre iOS 9 (less efficient, load in memory before removal) + let waypointAsynchronousFetchRequest = NSAsynchronousFetchRequest(fetchRequest: waypointFetchRequest) { asynchronousFetchResult in guard let results = asynchronousFetchResult.finalResult as? [CDWaypoint] else { return } @@ -543,7 +597,6 @@ class CoreDataHelper { do { // Executes all delete requests - try privateManagedObjectContext.execute(trackpointAsynchronousFetchRequest) try privateManagedObjectContext.execute(waypointAsynchronousFetchRequest) try privateManagedObjectContext.save() self.appDelegate.managedObjectContext.performAndWait { @@ -591,25 +644,38 @@ class CoreDataHelper { root = GPXRoot(creator: kGPXCreatorString) } // generates a GPXRoot from recovered data - if self.isContinued && self.tracksegments.count >= (self.lastTracksegmentId + 1) { + if self.isContinued { + if self.tracksegments.count >= (self.lastTracksegmentId + 1) { + //Check if there was a tracksegment + if root.tracks.last?.tracksegments.count == 0 { + root.tracks.last?.add(trackSegment: GPXTrackSegment()) + } + // if gpx is saved, but further trkpts are added after save, and crashed, trkpt are appended, not adding to new trkseg. + root.tracks.last?.tracksegments[Int(self.lastTracksegmentId)].add(trackpoints: self.tracksegments.first!.trackpoints) + self.tracksegments.remove(at: 0) + + } - //Check if there was a tracksegment - if root.tracks.last?.tracksegments.count == 0 { - root.tracks.last?.add(trackSegment: GPXTrackSegment()) + // Fix #151 + let count = root.waypoints.count + if count < self.waypointId, let last = root.waypoints.last, last =~ self.waypoints[count-1] { + + for index in count-1...self.waypoints.count-1 { + root.waypoints.append(self.waypoints[index]) + } } - // if gpx is saved, but further trkpts are added after save, and crashed, trkpt are appended, not adding to new trkseg. - root.tracks.last?.tracksegments[Int(self.lastTracksegmentId)].add(trackpoints: self.tracksegments.first!.trackpoints) - self.tracksegments.remove(at: 0) } else { track.tracksegments = self.tracksegments root.add(track: track) + root.add(waypoints: self.waypoints) } - root.waypoints = [GPXWaypoint]() - root.add(waypoints: self.waypoints) + //root.waypoints = [GPXWaypoint]() + //root.add(waypoints: self.waypoints) // asks user on what to do with recovered data DispatchQueue.main.sync { + print(root.gpx()) // main action sheet setup let alertController = UIAlertController(title: NSLocalizedString("CONTINUE_SESSION_TITLE", comment: "no comment"), message: NSLocalizedString("CONTINUE_SESSION_MESSAGE", comment: "no comment"), preferredStyle: .actionSheet) @@ -690,10 +756,27 @@ class CoreDataHelper { self.currentSegment = GPXTrackSegment() } + func clearAllExceptWaypoints() { + // once file recovery is completed, Core Data stored items are deleted. + self.deleteAllTrackFromCoreData() + + // once file recovery is completed, arrays are cleared. + self.tracksegments = [] + self.currentSegment = GPXTrackSegment() + + // current segment should be 'reset' as well + self.currentSegment = GPXTrackSegment() + + // reset order sorting ids + self.trackpointId = 0 + self.tracksegmentId = 0 + } + /// clears all func clearAll() { // once file recovery is completed, Core Data stored items are deleted. - self.deleteAllPointsFromCoreData() + self.deleteAllTrackFromCoreData() + self.deleteAllWaypointsFromCoreData() // once file recovery is completed, arrays are cleared. self.clearObjects() diff --git a/OpenGpxTracker/GPXMapView.swift b/OpenGpxTracker/GPXMapView.swift index 893d9cb5..21240fdb 100644 --- a/OpenGpxTracker/GPXMapView.swift +++ b/OpenGpxTracker/GPXMapView.swift @@ -197,7 +197,6 @@ class GPXMapView: MKMapView { let coords: CLLocationCoordinate2D = self.convert(point, toCoordinateFrom: self) let waypoint = GPXWaypoint(coordinate: coords) self.addWaypoint(waypoint) - self.coreDataHelper.add(toCoreData: waypoint) } @@ -210,6 +209,7 @@ class GPXMapView: MKMapView { self.session.addWaypoint(waypoint) self.addAnnotation(waypoint) self.extent.extendAreaToIncludeLocation(waypoint.coordinate) + self.coreDataHelper.add(toCoreData: waypoint) } /// diff --git a/OpenGpxTracker/GPXSession.swift b/OpenGpxTracker/GPXSession.swift index fe120e1a..ab961075 100644 --- a/OpenGpxTracker/GPXSession.swift +++ b/OpenGpxTracker/GPXSession.swift @@ -157,7 +157,7 @@ class GPXSession { self.tracks = gpx.tracks // remove last track as that track is packaged by Core Data, but should its tracksegments should be seperated, into self.tracksegments. - self.tracks.removeLast() + //self.tracks.removeLast() self.trackSegments = lastTrack.tracksegments diff --git a/OpenGpxTracker/GPXWaypoint+Comparison.swift b/OpenGpxTracker/GPXWaypoint+Comparison.swift new file mode 100644 index 00000000..282143f8 --- /dev/null +++ b/OpenGpxTracker/GPXWaypoint+Comparison.swift @@ -0,0 +1,28 @@ +// +// GPXWaypoint+Comparison.swift +// OpenGpxTracker +// +// Created by Vincent Neo on 2/1/20. +// + +import CoreGPX + +infix operator =~ + +extension GPXWaypoint { + + static func =~ (wpt1: GPXWaypoint, wpt2: GPXWaypoint) -> Bool { + if wpt1.latitude == wpt2.latitude + && wpt1.longitude == wpt2.longitude + //&& wpt1.elevation == wpt2.elevation + && wpt1.time == wpt2.time + //&& wpt1.name == wpt2.name + && wpt1.desc == wpt2.desc + { + return true + } + else { + return false + } + } +} diff --git a/OpenGpxTracker/ViewController.swift b/OpenGpxTracker/ViewController.swift index cc8138d5..f815ad79 100644 --- a/OpenGpxTracker/ViewController.swift +++ b/OpenGpxTracker/ViewController.swift @@ -907,7 +907,8 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate { print("viewController:: applicationWillTerminate") GPXFileManager.removeTemporaryFiles() if gpxTrackingStatus == .notStarted { - map.coreDataHelper.deleteAllPointsFromCoreData() + map.coreDataHelper.deleteAllTrackFromCoreData() + map.coreDataHelper.deleteAllWaypointsFromCoreData() } } @@ -1125,7 +1126,7 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate { GPXFileManager.save(filename!, gpxContents: gpxString) self.lastGpxFilename = filename! self.map.coreDataHelper.deleteCDRootFromCoreData() - self.map.coreDataHelper.clearAll() + self.map.coreDataHelper.clearAllExceptWaypoints() self.map.coreDataHelper.add(toCoreData: filename!, willContinueAfterSave: true) } let cancelAction = UIAlertAction(title: NSLocalizedString("CANCEL", comment: "no comment"), style: .cancel) { (action) in } From 79b79d647f445587404ccc6b7eb4d2cb503eb47e Mon Sep 17 00:00:00 2001 From: Vincent Neo <23420208+vincentneo@users.noreply.github.com> Date: Fri, 3 Jan 2020 14:08:32 +0800 Subject: [PATCH 2/3] fix duplications --- OpenGpxTracker.xcodeproj/project.pbxproj | 4 --- OpenGpxTracker/CoreDataHelper.swift | 15 ++++++----- OpenGpxTracker/GPXMapView.swift | 2 +- OpenGpxTracker/GPXWaypoint+Comparison.swift | 28 --------------------- 4 files changed, 10 insertions(+), 39 deletions(-) delete mode 100644 OpenGpxTracker/GPXWaypoint+Comparison.swift diff --git a/OpenGpxTracker.xcodeproj/project.pbxproj b/OpenGpxTracker.xcodeproj/project.pbxproj index f69182a3..7f627a51 100644 --- a/OpenGpxTracker.xcodeproj/project.pbxproj +++ b/OpenGpxTracker.xcodeproj/project.pbxproj @@ -9,7 +9,6 @@ /* Begin PBXBuildFile section */ 120DE71022B274910055C4CB /* GPXSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 120DE70F22B274910055C4CB /* GPXSession.swift */; }; 120DE71122B274A40055C4CB /* GPXSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 120DE70F22B274910055C4CB /* GPXSession.swift */; }; - 12534A5823BDC4FA00D6CE0A /* GPXWaypoint+Comparison.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12534A5723BDC4FA00D6CE0A /* GPXWaypoint+Comparison.swift */; }; 4588D66B230D23AA009AA75F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4588D66D230D23AA009AA75F /* InfoPlist.strings */; }; 4588D66F230D2476009AA75F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4588D671230D2476009AA75F /* InfoPlist.strings */; }; 45A430E9230D61240003C2F2 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 45A430EB230D61240003C2F2 /* Interface.storyboard */; }; @@ -138,7 +137,6 @@ /* Begin PBXFileReference section */ 120DE70F22B274910055C4CB /* GPXSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GPXSession.swift; sourceTree = ""; }; - 12534A5723BDC4FA00D6CE0A /* GPXWaypoint+Comparison.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GPXWaypoint+Comparison.swift"; sourceTree = ""; }; 3C3088B74A230AB1FD234D6F /* Pods_OpenGpxTracker_Watch.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_OpenGpxTracker_Watch.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 44E786790A477838358F948C /* Pods-OpenGpxTracker.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OpenGpxTracker.debug.xcconfig"; path = "Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker.debug.xcconfig"; sourceTree = ""; }; 455F78BD230AA9D6003705F3 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/LaunchScreen.strings; sourceTree = ""; }; @@ -290,7 +288,6 @@ BF6408A2225C63E700BB5242 /* CoreDataHelper.swift */, BF214B5D22E60B64000E96AA /* CLActivityType+Info.swift */, BF15092123916FC100F51F1B /* UIColor+DarkMode.swift */, - 12534A5723BDC4FA00D6CE0A /* GPXWaypoint+Comparison.swift */, ); name = Models; sourceTree = ""; @@ -779,7 +776,6 @@ 893BEC8619C7E62200C77354 /* GPXWaypoint+MKAnnotation.swift in Sources */, DC4908A31C4A332E009484AE /* MapViewDelegate.swift in Sources */, 898EED3619C6402900B4B207 /* GPXFilesTableViewController.swift in Sources */, - 12534A5823BDC4FA00D6CE0A /* GPXWaypoint+Comparison.swift in Sources */, DC4908A11C4A136F009484AE /* TrackerButton.swift in Sources */, 89F8749F1BBCB97F004EF41A /* GPXRoot+length.swift in Sources */, ); diff --git a/OpenGpxTracker/CoreDataHelper.swift b/OpenGpxTracker/CoreDataHelper.swift index e21487ee..80fffdd3 100644 --- a/OpenGpxTracker/CoreDataHelper.swift +++ b/OpenGpxTracker/CoreDataHelper.swift @@ -657,22 +657,25 @@ class CoreDataHelper { } // Fix #151 + /* let count = root.waypoints.count - if count < self.waypointId, let last = root.waypoints.last, last =~ self.waypoints[count-1] { - - for index in count-1...self.waypoints.count-1 { + if count < self.waypointId {//, let last = root.waypoints.last, last =~ self.waypoints[count-1] { + root.waypoints = self.waypoints + /*for index in count-1...self.waypoints.count-1 { root.waypoints.append(self.waypoints[index]) - } - } + }*/ + }*/ } else { track.tracksegments = self.tracksegments root.add(track: track) - root.add(waypoints: self.waypoints) + //root.waypoints = self.waypoints + //root.add(waypoints: self.waypoints) } //root.waypoints = [GPXWaypoint]() //root.add(waypoints: self.waypoints) + root.waypoints = self.waypoints // asks user on what to do with recovered data DispatchQueue.main.sync { print(root.gpx()) diff --git a/OpenGpxTracker/GPXMapView.swift b/OpenGpxTracker/GPXMapView.swift index 21240fdb..893d9cb5 100644 --- a/OpenGpxTracker/GPXMapView.swift +++ b/OpenGpxTracker/GPXMapView.swift @@ -197,6 +197,7 @@ class GPXMapView: MKMapView { let coords: CLLocationCoordinate2D = self.convert(point, toCoordinateFrom: self) let waypoint = GPXWaypoint(coordinate: coords) self.addWaypoint(waypoint) + self.coreDataHelper.add(toCoreData: waypoint) } @@ -209,7 +210,6 @@ class GPXMapView: MKMapView { self.session.addWaypoint(waypoint) self.addAnnotation(waypoint) self.extent.extendAreaToIncludeLocation(waypoint.coordinate) - self.coreDataHelper.add(toCoreData: waypoint) } /// diff --git a/OpenGpxTracker/GPXWaypoint+Comparison.swift b/OpenGpxTracker/GPXWaypoint+Comparison.swift deleted file mode 100644 index 282143f8..00000000 --- a/OpenGpxTracker/GPXWaypoint+Comparison.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// GPXWaypoint+Comparison.swift -// OpenGpxTracker -// -// Created by Vincent Neo on 2/1/20. -// - -import CoreGPX - -infix operator =~ - -extension GPXWaypoint { - - static func =~ (wpt1: GPXWaypoint, wpt2: GPXWaypoint) -> Bool { - if wpt1.latitude == wpt2.latitude - && wpt1.longitude == wpt2.longitude - //&& wpt1.elevation == wpt2.elevation - && wpt1.time == wpt2.time - //&& wpt1.name == wpt2.name - && wpt1.desc == wpt2.desc - { - return true - } - else { - return false - } - } -} From 157bb8eafdb74fb0c6d221e6820fbc5c56b63364 Mon Sep 17 00:00:00 2001 From: Vincent Neo <23420208+vincentneo@users.noreply.github.com> Date: Fri, 3 Jan 2020 14:11:16 +0800 Subject: [PATCH 3/3] revert some code --- OpenGpxTracker/CoreDataHelper.swift | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/OpenGpxTracker/CoreDataHelper.swift b/OpenGpxTracker/CoreDataHelper.swift index 80fffdd3..8d595839 100644 --- a/OpenGpxTracker/CoreDataHelper.swift +++ b/OpenGpxTracker/CoreDataHelper.swift @@ -644,27 +644,16 @@ class CoreDataHelper { root = GPXRoot(creator: kGPXCreatorString) } // generates a GPXRoot from recovered data - if self.isContinued { - if self.tracksegments.count >= (self.lastTracksegmentId + 1) { - //Check if there was a tracksegment - if root.tracks.last?.tracksegments.count == 0 { - root.tracks.last?.add(trackSegment: GPXTrackSegment()) - } - // if gpx is saved, but further trkpts are added after save, and crashed, trkpt are appended, not adding to new trkseg. - root.tracks.last?.tracksegments[Int(self.lastTracksegmentId)].add(trackpoints: self.tracksegments.first!.trackpoints) - self.tracksegments.remove(at: 0) - - } + if self.isContinued && self.tracksegments.count >= (self.lastTracksegmentId + 1) { - // Fix #151 - /* - let count = root.waypoints.count - if count < self.waypointId {//, let last = root.waypoints.last, last =~ self.waypoints[count-1] { - root.waypoints = self.waypoints - /*for index in count-1...self.waypoints.count-1 { - root.waypoints.append(self.waypoints[index]) - }*/ - }*/ + //Check if there was a tracksegment + if root.tracks.last?.tracksegments.count == 0 { + root.tracks.last?.add(trackSegment: GPXTrackSegment()) + } + // if gpx is saved, but further trkpts are added after save, and crashed, trkpt are appended, not adding to new trkseg. + root.tracks.last?.tracksegments[Int(self.lastTracksegmentId)].add(trackpoints: self.tracksegments.first!.trackpoints) + self.tracksegments.remove(at: 0) + } else {