无法在控制台应用

时间:2016-02-19 22:08:47

标签: objective-c macos nstimer nsrunloop

对于项目,我需要使用CoreLocation服务,但使用其他语言。但是,问题是无限的NSRunLoop。我试图使用观察员但没有任何成功。

我没有得到任何东西
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

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

所以,这是我的代码:

#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 个答案:

答案 0 :(得分:1)

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

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

Apple doc about Run Loops