I wrote a wrapper around CLLocationManager class. There are different UIViewControllers using the LocationManager class. It's a singleton and I set it to nil after use. However, it only works with the first class that uses it. How to kill it? I'm already calling stopUpdatingLocation.
I've tried this already
this post suggests that I shouldn't use a singleton, but if I do that, it doesn't work at all.
MyViewController.m
LocationManager * locationManager;
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
locationManager = [LocationManager sharedManager];
[locationManager start];
locationManager.delegate = self;
}
#pragma mark - Delegate functions
-(void)isLocationManagerDelegateTriggered:(CLLocation *) location {
// works only first time, but gets triggered every time
[locationManager stop];
locationManager.delegate = nil;
NSLog(@"latitude = %f longitude = %f",location.coordinate.latitude, location.coordinate.longitude);
}
LocationManager.m
#import <CoreLocation/CoreLocation.h>
@implementation LocationManager
CLLocationManager *clLocationManager;
@synthesize delegate;
/* Singleton */
static LocationManager *sharedSingleton;
/* Singleton */
+ (id)sharedManager
{
static LocationManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
clLocationManager = [[CLLocationManager alloc] init];
});
return sharedMyManager;
}
#pragma mark - Public functions
- (void)start {
[clLocationManager setDelegate:(id<CLLocationManagerDelegate>)self]; //If I put this [clLocationManager setDesiredAccuracy:kCLLocationAccuracyBest]; // and this in initialize, it doesn't work anymore.
[clLocationManager startUpdatingLocation];
}
- (void)stop {
[clLocationManager stopUpdatingLocation];
}
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
CLLocation *currentLocation = newLocation;
if (currentLocation != nil) {
[delegate isLocationManagerDelegateTriggered:currentLocation];
}
}
@end
LocationManager.h
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@class LocationManager;
@protocol LocationManagerDelegate
@required
-(void)isLocationManagerDelegateTriggered:(CLLocation *) location;
@end
@interface LocationManager : NSObject <CLLocationManagerDelegate>
+ (id)sharedManager;
-(void)start;
- (void)stop;
- (double) getDistanceToLocationInKM:(CLLocation *) location currentLocation:(CLLocation *)currentlocation;
@property (nonatomic, assign) id delegate;
@end
The delegate gets fired only once:
2014-05-17 20:04:03.110 Wobbly[2064:60b] latitude = 50.865281 longitude = 5.732814