@@ -481,7 +481,7 @@ class CoreDataHelper {
481
481
482
482
483
483
/// Delete all trackpoints and waypoints in Core Data.
484
- func deleteAllPointsFromCoreData ( ) {
484
+ func deleteAllTrackFromCoreData ( ) {
485
485
486
486
let privateManagedObjectContext = NSManagedObjectContext ( concurrencyType: . privateQueueConcurrencyType)
487
487
privateManagedObjectContext. parent = appDelegate. managedObjectContext
@@ -490,18 +490,14 @@ class CoreDataHelper {
490
490
491
491
// Creates fetch requests for both trackpoint and waypoint
492
492
let trackpointFetchRequest = NSFetchRequest < NSFetchRequestResult > ( entityName: " CDTrackpoint " )
493
- let waypointFetchRequest = NSFetchRequest < NSFetchRequestResult > ( entityName: " CDWaypoint " )
494
493
495
494
if #available( iOS 9 . 0 , * ) {
496
495
privateManagedObjectContext. perform {
497
496
do {
498
497
let trackpointDeleteRequest = NSBatchDeleteRequest ( fetchRequest: trackpointFetchRequest)
499
- let waypointDeleteRequest = NSBatchDeleteRequest ( fetchRequest: waypointFetchRequest)
500
498
501
499
// execute both delete requests.
502
500
try privateManagedObjectContext. execute ( trackpointDeleteRequest)
503
- try privateManagedObjectContext. execute ( waypointDeleteRequest)
504
-
505
501
try privateManagedObjectContext. save ( )
506
502
507
503
self . appDelegate. managedObjectContext. performAndWait {
@@ -530,6 +526,64 @@ class CoreDataHelper {
530
526
}
531
527
}
532
528
529
+ do {
530
+ // Executes all delete requests
531
+ try privateManagedObjectContext. execute ( trackpointAsynchronousFetchRequest)
532
+ try privateManagedObjectContext. save ( )
533
+ self . appDelegate. managedObjectContext. performAndWait {
534
+ do {
535
+ // Saves the changes from the child to the main context to be applied properly
536
+ try self . appDelegate. managedObjectContext. save ( )
537
+ } catch {
538
+ print ( " Failure to save context after delete: \( error) " )
539
+ }
540
+ }
541
+
542
+ } catch let error {
543
+ print ( " NSAsynchronousFetchRequest (for batch delete <iOS 9) error: \( error) " )
544
+ }
545
+ }
546
+ }
547
+
548
+ /// Delete all trackpoints and waypoints in Core Data.
549
+ func deleteAllWaypointsFromCoreData( ) {
550
+
551
+ let privateManagedObjectContext = NSManagedObjectContext ( concurrencyType: . privateQueueConcurrencyType)
552
+ privateManagedObjectContext. parent = appDelegate. managedObjectContext
553
+
554
+ print ( " Core Data Helper: Batch Delete trackpoints and waypoints from Core Data " )
555
+
556
+ // Creates fetch requests for both trackpoint and waypoint
557
+ let waypointFetchRequest = NSFetchRequest < NSFetchRequestResult > ( entityName: " CDWaypoint " )
558
+
559
+ if #available( iOS 9 . 0 , * ) {
560
+ privateManagedObjectContext. perform {
561
+ do {
562
+ let waypointDeleteRequest = NSBatchDeleteRequest ( fetchRequest: waypointFetchRequest)
563
+
564
+ // execute both delete requests.
565
+ try privateManagedObjectContext. execute ( waypointDeleteRequest)
566
+
567
+ try privateManagedObjectContext. save ( )
568
+
569
+ self . appDelegate. managedObjectContext. performAndWait {
570
+ do {
571
+ // Saves the changes from the child to the main context to be applied properly
572
+ try self . appDelegate. managedObjectContext. save ( )
573
+ } catch {
574
+ print ( " Failure to save context after delete: \( error) " )
575
+ }
576
+ }
577
+ }
578
+ catch {
579
+ print ( " Failed to delete all from core data, error: \( error) " )
580
+ }
581
+
582
+ }
583
+
584
+ }
585
+ else { // for pre iOS 9 (less efficient, load in memory before removal)
586
+
533
587
let waypointAsynchronousFetchRequest = NSAsynchronousFetchRequest ( fetchRequest: waypointFetchRequest) { asynchronousFetchResult in
534
588
535
589
guard let results = asynchronousFetchResult. finalResult as? [ CDWaypoint ] else { return }
@@ -543,7 +597,6 @@ class CoreDataHelper {
543
597
544
598
do {
545
599
// Executes all delete requests
546
- try privateManagedObjectContext. execute ( trackpointAsynchronousFetchRequest)
547
600
try privateManagedObjectContext. execute ( waypointAsynchronousFetchRequest)
548
601
try privateManagedObjectContext. save ( )
549
602
self . appDelegate. managedObjectContext. performAndWait {
@@ -600,16 +653,21 @@ class CoreDataHelper {
600
653
// if gpx is saved, but further trkpts are added after save, and crashed, trkpt are appended, not adding to new trkseg.
601
654
root. tracks. last? . tracksegments [ Int ( self . lastTracksegmentId) ] . add ( trackpoints: self . tracksegments. first!. trackpoints)
602
655
self . tracksegments. remove ( at: 0 )
656
+
603
657
604
658
}
605
659
else {
606
660
track. tracksegments = self . tracksegments
607
661
root. add ( track: track)
662
+ //root.waypoints = self.waypoints
663
+ //root.add(waypoints: self.waypoints)
608
664
}
609
- root. waypoints = [ GPXWaypoint] ( )
610
- root. add ( waypoints: self . waypoints)
665
+ //root.waypoints = [GPXWaypoint]()
666
+ //root.add(waypoints: self.waypoints)
667
+ root. waypoints = self . waypoints
611
668
// asks user on what to do with recovered data
612
669
DispatchQueue . main. sync {
670
+ print ( root. gpx ( ) )
613
671
// main action sheet setup
614
672
let alertController = UIAlertController ( title: NSLocalizedString ( " CONTINUE_SESSION_TITLE " , comment: " no comment " ) , message: NSLocalizedString ( " CONTINUE_SESSION_MESSAGE " , comment: " no comment " ) , preferredStyle: . actionSheet)
615
673
@@ -690,10 +748,27 @@ class CoreDataHelper {
690
748
self . currentSegment = GPXTrackSegment ( )
691
749
}
692
750
751
+ func clearAllExceptWaypoints( ) {
752
+ // once file recovery is completed, Core Data stored items are deleted.
753
+ self . deleteAllTrackFromCoreData ( )
754
+
755
+ // once file recovery is completed, arrays are cleared.
756
+ self . tracksegments = [ ]
757
+ self . currentSegment = GPXTrackSegment ( )
758
+
759
+ // current segment should be 'reset' as well
760
+ self . currentSegment = GPXTrackSegment ( )
761
+
762
+ // reset order sorting ids
763
+ self . trackpointId = 0
764
+ self . tracksegmentId = 0
765
+ }
766
+
693
767
/// clears all
694
768
func clearAll( ) {
695
769
// once file recovery is completed, Core Data stored items are deleted.
696
- self . deleteAllPointsFromCoreData ( )
770
+ self . deleteAllTrackFromCoreData ( )
771
+ self . deleteAllWaypointsFromCoreData ( )
697
772
698
773
// once file recovery is completed, arrays are cleared.
699
774
self . clearObjects ( )
0 commit comments