2016-02-19 61 views
0

对于项目,我需要使用CoreLocation服务,但使用其他语言。但是,这个问题是一个无限的NSRunLoop。我试图使用观察员,但没有任何成功。我没有得到任何东西无法在控制台应用程序中停止NSRunLoop

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 

所以我在运行循环中等待位置更新。我可以使用runUntilDate,但我需要确保用户在接下来的3/5/10秒内点击Ok。

所以,这里是我的代码:

#import <Foundation/Foundation.h> 
#import <CoreLocation/CoreLocation.h> 

@interface Location : NSObject <CLLocationManagerDelegate> 
@property (nonatomic, retain)CLLocationManager *manager; 
@property (nonatomic, retain)NSTimer *timer; 

@end 

@implementation Location 

- (instancetype)init { 
    if (self = [super init]) { 
     _manager = [[CLLocationManager alloc] init]; 
     _manager.delegate = self; 
    } 

    return self; 
} 

- (void)dealloc { 
    [_manager release]; 
    [_timer release]; 
    [super dealloc]; 
} 

- (void)launch 
{ 
    [_manager startUpdatingLocation]; 

    _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 
            target:self 
            selector:@selector(checkIfUpdated:) 
            userInfo:nil 
            repeats:YES]; 
    [_timer release]; 
    [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode]; 
    [[NSRunLoop currentRunLoop] run]; 
} 

- (void)checkIfUpdated:(NSTimer *)timer 
{ 
    if (_manager.location != nil) { 
     [timer invalidate]; 
     [timer release]; 
     NSLog(@"invalidate the timer %@", timer); 
    } 
} 


- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{ 
    NSLog(@"Error %@", error.userInfo); 
    [_timer invalidate]; 
    [_timer release]; 
} 

@end 


int main(int argc, const char * argv[]) { 
    Location *location = [[Location alloc] init]; 

    [location launch]; 

    NSString *str = [NSString stringWithFormat:@"%f, %f", location.manager.location.coordinate.latitude, 
        location.manager.location.coordinate.longitude]; 
    [str release]; 
    NSLog(@"%s", [str UTF8String]); 
    return 0; 
} 

预先感谢您。 干杯

回答

1

一般来说,你不应该使用无限制run。您必须提供停止循环的能力。在你的情况下,它可以是这样的:

while (!cancelled && !buttonTouched) 
{ 
    NSDate *nextDate = [NSDate dateWithTimeIntervalSinceNow:1.0]; 
    [[NSRunLoop currentRunLoop] runUntilDate:nextDate]; 
} 

Apple doc about Run Loops

+0

哦,谢谢,你真的救了屁股:) –

相关问题