对于项目,我需要使用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;
}
提前谢谢你。 干杯
答案 0 :(得分:1)
一般情况下,您永远不应使用无限run
。您必须提供停止循环的功能。在你的情况下,它可以是这样的:
while (!cancelled && !buttonTouched)
{
NSDate *nextDate = [NSDate dateWithTimeIntervalSinceNow:1.0];
[[NSRunLoop currentRunLoop] runUntilDate:nextDate];
}