Tôi có một ứng dụng xoay quanh GPS của thiết bị và thông tin đến từ nó. Điều quan trọng là dữ liệu vị trí phải chính xác và cập nhật. Tôi biết rằng thiết bị bị giới hạn bởi GPS và giới hạn của GPS, nhưng tôi đã tự hỏi liệu có bất kỳ điều gì tôi có thể làm để tinh chỉnh/cải thiện hiệu suất của GPS iPhone, đặc biệt là ở khu vực tốc độ. Bởi vì cập nhật vị trí tụt hậu khoảng 3-5 giây sau vị trí thời gian thực của thiết bị, vận tốc được báo cáo bởi trình quản lý vị trí cũng chậm hơn nhiều so với giá trị thời gian thực. Trong trường hợp của tôi, điều đó đơn giản là quá dài. Tôi hiểu rằng có thể không có bất cứ điều gì tôi có thể làm, nhưng có ai có bất kỳ thành công trong việc cải thiện sự đáp ứng của iPhone GPS? Mỗi chút tạo nên sự khác biệt.CLLocationQuản lý phản hồi
Chỉnh sửa 1:
Trình quản lý vị trí của tôi nằm trong một lớp đơn, như Apple khuyến cáo.
Bên SingletonDataController.m:
static CLLocationManager* locationManager;
locationManager = [CLLocationManager new];
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.headingFilter = kCLHeadingFilterNone;
if(([[UIDevice currentDevice] batteryState] == UIDeviceBatteryStateCharging) || ([[UIDevice currentDevice] batteryState] == UIDeviceBatteryStateFull)) {
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
} else {
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
}
[sharedSingleton setLocationManager:locationManager];
[locationManager release];
Bên MapView.m (nơi quản lý địa điểm được thực sự sử dụng):
- (id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil {
//setup
[SingletonDataController sharedSingleton].locationManager.delegate = self;
//more setup
}
- (void)batteryChanged {
if(([[UIDevice currentDevice] batteryState] == UIDeviceBatteryStateCharging) || ([[UIDevice currentDevice] batteryState] == UIDeviceBatteryStateFull)) {
[SingletonDataController sharedSingleton].locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
} else {
[SingletonDataController sharedSingleton].locationManager.desiredAccuracy = kCLLocationAccuracyBest;
}
}
- (void)viewDidLoad {
//setup
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(batteryChanged)
name:UIDeviceBatteryStateDidChangeNotification
object:nil];
//other setup
}
Việc xử lý dữ liệu xảy ra bên locationManager:didUpdateToLocation:fromLocation:
. Tôi không tin rằng sự kém hiệu quả ở đây là nguyên nhân của sự tụt hậu.
locationManager:didUpdateToLocation:fromLocation:
cuộc gọi phương pháp này để cập nhật giao diện người dùng:
- (void)setLabels:(CLLocation*)newLocation fromOldLocation:(CLLocation*)oldLocation {
//set speed label
if(iterations > 0) {
if(currentSpeed > keyStopSpeedFilter) {
if(isFollowing) {
[mapViewGlobal setRegion:MKCoordinateRegionMake([newLocation coordinate], mapViewGlobal.region.span)];
}
NSString* currentSpeedString;
if(isCustomary) {
currentSpeedString = [[NSString alloc] initWithFormat:@"%.1f miles per hour", (currentSpeed * 2.23693629f)];
} else {
currentSpeedString = [[NSString alloc] initWithFormat:@"%.1f km per hour", (currentSpeed * 3.6f)];
}
[speedLabel setText:currentSpeedString];
[currentSpeedString release];
} else {
speedLabel.text = @"Not moving";
}
}
//set average speed label
if(iterations > 4 && movementIterations > 2) {
NSString* averageSpeedString;
if(isCustomary) {
averageSpeedString = [[NSString alloc] initWithFormat:@"%.1f miles per hour", (float)((speedAverages/(long double)movementIterations) * 2.23693629f)];
} else {
averageSpeedString = [[NSString alloc] initWithFormat:@"%.1f km per hour", (float)((speedAverages/(long double)movementIterations) * 3.6f)];
}
[averageSpeedLabel setText:averageSpeedString];
[averageSpeedString release];
}
//set elapsed time label
NSInteger seconds = [[NSDate date] timeIntervalSinceDate:dataObject.locationManagerStartDate];
NSInteger minutes = seconds/60;
NSInteger hours = minutes/60;
//get remainder
seconds %= 60;
NSString* timeString;
NSString* secondsString;
NSString* minutesString;
NSString* hoursString;
if((seconds % 60) < 10) {
secondsString = [[NSString alloc] initWithFormat:@"0%i", seconds];
} else {
secondsString = [[NSString alloc] initWithFormat:@"%i", seconds];
}
if((minutes % 60) < 10) {
minutesString = [[NSString alloc] initWithFormat:@"0%i", minutes];
} else {
minutesString = [[NSString alloc] initWithFormat:@"%i", minutes];
}
if((hours % 60) < 10) {
hoursString = [[NSString alloc] initWithFormat:@"0%i", hours];
} else {
hoursString = [[NSString alloc] initWithFormat:@"%i", hours];
}
timeString = [[NSString alloc] initWithFormat:@"%@:%@:%@", hoursString, minutesString, secondsString];
[elapsedTimeLabel setText:timeString];
[timeString release], timeString = nil;
[secondsString release], secondsString = nil;
[minutesString release], minutesString = nil;
[hoursString release], hoursString = nil;
NSString* totalDistanceString;
if(isCustomary) {
totalDistanceString = [[NSString alloc] initWithFormat:@"Total: %.2f mi", (float)distance * 0.000621371192f];
} else {
totalDistanceString = [[NSString alloc] initWithFormat:@"Total: %.2f km", (float)distance/1000.0f];
}
[customTopBar setTitle:totalDistanceString];
[totalDistanceString release];
}
Với một vài NSDates và NSLogs Tôi đã phát hiện ra rằng việc thực hiện của toàn bộ locationManager:didUpdateToLocation:fromLocation:
(không chỉ là nhãn phương pháp cập nhật) không bao giờ mất hơn về 8ms trên iPhone 4 của tôi; nói cách khác, việc xử lý dữ liệu không phải là vấn đề.
Cho chúng tôi biết cách bạn đang nhận dữ liệu vị trí. Độ trễ đó không bình thường. – sosborn
Đã thêm mã. Tôi có thể đăng thêm nếu cần. –
3-5 giây có thể là một chút cường điệu; nó trễ và tầm 3-5 chỉ xuất hiện trong đầu tôi vì một lý do nào đó. Ngày mai tôi sẽ chạy một số xét nghiệm để có được con số chính xác. –