当前位置:  开发笔记 > IOS > 正文

获取iPhone当前位置的最简单方法是什么?

如何解决《获取iPhone当前位置的最简单方法是什么?》经验,为你挑选了2个好方法。

我已经知道如何使用CLLocationManager,所以我可以用代表和所有这些来完成它.

但我希望有一个方便的方法,只需获取当前位置一次,然后阻塞直到获得结果.



1> Brad The App..:

我所做的是实现一个单例类来管理核心位置的更新.要访问我当前的位置,我会做一个CLLocation *myLocation = [[LocationManager sharedInstance] currentLocation]; 如果你想阻止主线程,你可以做这样的事情:

while ([[LocationManager sharedInstance] locationKnown] == NO){
   //blocking here
   //do stuff here, dont forget to have some kind of timeout to get out of this blocked    //state
}

但是,正如已经指出的那样,阻塞主线程可能不是一个好主意,但是当你正在构建一些东西时,这可能是一个很好的跳跃点.您还会注意到我编写的类检查位置更新的时间戳并忽略任何旧的,以防止从核心位置获取过时数据的问题.

这是我写的单身课程.请注意,边缘有点粗糙:

#import 
#import 

@interface  LocationController : NSObject  {
    CLLocationManager *locationManager;
    CLLocation *currentLocation;
}

+ (LocationController *)sharedInstance;

-(void) start;
-(void) stop;
-(BOOL) locationKnown;

@property (nonatomic, retain) CLLocation *currentLocation;

@end
@implementation LocationController

@synthesize currentLocation;

static LocationController *sharedInstance;

+ (LocationController *)sharedInstance {
    @synchronized(self) {
        if (!sharedInstance)
            sharedInstance=[[LocationController alloc] init];       
    }
    return sharedInstance;
}

+(id)alloc {
    @synchronized(self) {
        NSAssert(sharedInstance == nil, @"Attempted to allocate a second instance of a singleton LocationController.");
        sharedInstance = [super alloc];
    }
    return sharedInstance;
}

-(id) init {
    if (self = [super init]) {
        self.currentLocation = [[CLLocation alloc] init];
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
        [self start];
    }
    return self;
}

-(void) start {
    [locationManager startUpdatingLocation];
}

-(void) stop {
    [locationManager stopUpdatingLocation];
}

-(BOOL) locationKnown { 
     if (round(currentLocation.speed) == -1) return NO; else return YES; 
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    //if the time interval returned from core location is more than two minutes we ignore it because it might be from an old session
    if ( abs([newLocation.timestamp timeIntervalSinceDate: [NSDate date]]) < 120) {     
        self.currentLocation = newLocation;
    }
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    UIAlertView *alert;
    alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[error description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    [alert release];
}

-(void) dealloc {
    [locationManager release];
    [currentLocation release];
    [super dealloc];
}

@end


我编辑了你的代码,希望我理解正确.
您只分配了资源但尚未发布.你能告诉我你在哪里发布它不会引起任何问题.

2> Chris Hanson..:

没有这样的便利,你不应该创建自己的."阻塞直到它得到结果"是像iPhone这样的设备上非常糟糕的编程习惯.检索位置可能需要几秒钟; 你不应该让你的用户像这样等待,代表们确保他们不这样做.


我不同意,"阻止直到完成"在各种应用程序中有许多合法用途,并不是"冻结UI直到完成"的同义词.试图让*所有*异步只会导致奇怪的行为和错误的应用程序.如果用户需要显示的信息尚不可用,谁会关心用户界面的显示/响应速度?异步操作有它们的位置,阻塞操作也是如此.这不是一个好,另一个坏的情况.
推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有