繁体   English   中英

CLLocationManager仅在第一次使用

[英]CLLocationManager only works first time

我围绕CLLocationManager类编写了一个包装器。 使用LocationManager类的UIViewControllers不同。 这是一个单例,使用后我将其设置为nil。 但是,它仅适用于使用它的第一类。 如何杀死它? 我已经在调用stopUpdatingLocation

我已经尝试过

这篇文章表明我不应该使用单例,但是如果我这样做,那根本就行不通。

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

代表仅被解雇一次:

2014-05-17 20:04:03.110 Wobbly [2064:60b]纬度= 50.865281经度= 5.732814

您正在使用以下方法分配对象:

locationManager = [[LocationManager alloc]init];

它不会创建单例实例。

而不是那样,您需要使用:

我围绕CLLocationManager类编写了一个包装器。 使用LocationManager类的UIViewControllers不同。 这是一个单例,使用后我将其设置为nil。 但是,它仅适用于使用它的第一类。 如何杀死它? 我已经在打电话给stopUpdatingLocation。

我已经尝试过了

这篇文章表明我不应该使用单例,但是如果我这样做,那根本就行不通。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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