简体   繁体   中英

CLLocationManager only works first time

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

You are allocating the object using:

locationManager = [[LocationManager alloc]init];

It won't create a singleton instance.

Instead of that you need to use like:

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;
}

LocationManager.m

#import <CoreLocation/CoreLocation.h>

@implementation LocationManager

CLLocationManager *clLocationManager;

@synthesize delegate;

/* 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
{
    if(firsttime)
    {
        firsttime = false;
        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 technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM