![](/img/trans.png)
[英]CLLocationManager only monitors regions the first time the app is run after install
[英]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.