Приложение для iphone - как получить текущее местоположение только один раз и сохранить его для использования в другой функции?

Я работал над этим в течение последних 2 недель - у меня есть приложение, которое показывает четкий маршрут на карте, который идет от начальной точки до конечной точки. точка назначения - это адрес пользователя (как определено / введено пользователем в меню настроек, которое мы настроили), и если я жестко задаю начальную точку, карта, маршрут и приложение работают нормально. как только я пытаюсь реализовать все, что связано с использованием cllocation или cllocationmanager, он вылетает и выдает ошибку потока (их 3).

Вот текущий заголовок контроллера представления & Файл реализации для этого:

#import 
#import 
#import "MapView.h"
#import "Place.h"
#import 


@interface HomeMapViewController : UIViewController {

    IBOutlet UILabel *HomeAddressLabel;

}

@property (weak, nonatomic) IBOutlet MKMapView *MapView;
@property (strong, nonatomic) IBOutlet CLLocationManager *location;
@end

Файл реализации: I '

#import "HomeMapViewController.h"



@interface HomeMapViewController ()

@end


@implementation HomeMapViewController
@synthesize MapView;
@synthesize location;
double lat = 37.331706;
double lon = -122.030598;
- (id)initWithNibNameNSString *)nibNameOrNil bundleNSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}


- (void)viewDidLoad
{
    //Retrieve saved address before view loads
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *HomeAddress = [defaults objectForKey:@"HomeAddress"];
    NSString *HomeCity = [defaults objectForKey:@"HomeCity"];
    NSString *HomeProvince = [defaults objectForKey:@"HomeProvince"];
    NSString *HomeZip = [defaults objectForKey:@"HomeZip"];
    NSString *HomeCountry = [defaults objectForKey:@"HomeCountry"];
    NSString *HomeAddressFull = [NSString stringWithFormat:@"%@, %@, %@, %@, %@", HomeAddress, HomeCity, HomeProvince, HomeZip, HomeCountry];

    //Set address label to saved address values
    HomeAddressLabel.text = HomeAddressFull;



    //Map Route Code

        MapView* mapView = [[MapView alloc] initWithFrame:
                        CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
        //Shows user location

    [self.MapView setShowsUserLocation:YES];
    //set which mapview to show
        [self.MapView addSubview:mapView];

    self.location = [[CLLocationManager alloc]init];
    location.delegate = self;
    location.desiredAccuracy=kCLLocationAccuracyBest;
    location.distanceFilter = kCLLocationAccuracyBestForNavigation;//constant update of device location
    [location startUpdatingLocation];


    Place* start = [[Place alloc] init];
    start.name = @"Start Location";
    start.description = @"You started here.";
    //^should be changed to current location once that is implemented
    //start.latitude =    37.331706;
    //start.longitude = -122.030598;
    start.latitude = lat;
    start.longitude = lon;
    //start.latitude = location.location.coordinate.latitude;
    //start.longitude = location.location.coordinate.longitude;


    //Geocoder Code
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:HomeAddressFull completionHandler:^(NSArray *placemarks, NSError *error) {
        if (error) {
            NSLog(@"Error: %@", [error localizedDescription]);
            return;
        }

        for (id object in placemarks) {
            CLPlacemark *placemark = object;



            Place* destination = [[Place alloc] init];
            destination.name = @"Destination";
            destination.description = [NSString stringWithFormat:@"%@, %@, %@", HomeAddress, HomeCity, HomeProvince];
            destination.latitude = placemark.location.coordinate.latitude;
            destination.longitude = placemark.location.coordinate.longitude;

            [mapView showRouteFrom:start toestination];
        }
    }];


    [super viewDidLoad];

}

- (void)locationManagerCLLocationManager *)manager didUpdateToLocationCLLocation *)newLocation fromLocationCLLocation *)oldLocation{
    [manager stopUpdatingLocation];

}



//************NEW METHOD
-(void)locationManagerCLLocationManager *)manager didFailWithErrorNSError *)error{
    NSString *msg = @"Error obtraining location:";
    UIAlertView *alert;
    alert = [[UIAlertView alloc]
             initWithTitle:@"Error"
             message:msg delegate:self
             cancelButtonTitle:@"OK"
             otherButtonTitles: nil];
    [alert show];

}

- (void)viewDidUnload
{
    [self setMapView:nil];
    HomeAddressLabel = nil;
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientationUIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


@end

В основном я хотел бы спросить, может ли кто-нибудь помочь пролить свет на то, как я могу получить координаты текущего местоположения пользователей и сохранить их как значения start.latitude и start.longitude, чтобы маршрут показывал путь от текущего местоположения пользователя до их место назначения. маршрут не должен обновляться при перемещении пользователя, я просто хотел бы иметь аннотацию / метку на текущем местоположении и пункте назначения пользователя (как у меня есть), и тогда синяя точка (он же пользователь) сможет увидеть, как они движутся по маршруту, по которому они должны идти. Я'Мы испробовали все предложения здесь - и некоторые не работали вообще, некоторые работали только один раз, а затем после этого снова не работали (даже после сброса содержимого симулятора!). некоторые ссылки актуальны, но очень устарели, поэтому методыт работа.

И здесь я думал, что получить текущие координаты местоположения пользователей было бы более легкой задачей этой функции!

Ответы на вопрос(2)

Ваш ответ на вопрос