Я полностью в тупике, вот ситуация:
Мое приложение использует платформу Core Location для получения текущего местоположения пользователя, а затем отправляет запрос на мой сервер по адресу TrailBehind для поиска интересных мест поблизости и отображает их в виде списка. Нет проблем.
Для экономии батарей я отключаю службу GPS после получения данных с сервера. Если пользователь перемещается во время использования приложения и хочет создать новый список, он нажимает «Обновить» на контроллере навигации, и служба CLLocation снова активируется, с сервера извлекается новый пакет данных и таблица перерисовывается.
Пока приложение получает данные с моего сервера, я загружаю экран загрузки с вращающимся глобусом с надписью «Идет загрузка, пожалуйста, подождите», и я скрываю панель навигации, чтобы они не нажимали «назад».
Итак, начальный захват данных с сервера проходит без нареканий.
В первый раз, когда я нажимаю, обновляется весь код, выполняемый для получения нового местоположения, снова проверяет сервер на новый список данных и обновляет ячейки. Однако вместо загрузки табличного представления, как и должно быть, восстанавливается панель контроллера навигации для табличного представления, но все равно отображается мое загрузочное представление в главном окне. Это верно только для устройства, в симуляторе все прекрасно работает.
ВТОРОЙ раз, когда я нажимаю обновить, функция работает нормально.
В третий раз, когда я нажимаю обновить, происходит сбой, как указано выше.
В четвертый раз, когда я нажимаю «Обновить», он работает нормально.
ПЯТЫЙ раз, когда я нажимаю обновить, происходит сбой, как указано выше.
и т. Д., Четные обновления выполняются успешно, а нечетные обновления не выполняются. Я перешагнул весь мой код построчно, и, кажется, все работает нормально. Я на самом деле продолжал перешагивать основные инструкции, и после огромного количества нажатий «переступить через» я обнаружил, что табличное представление действительно отображается на экране в какой-то момент в CFRunLoopRunSpecific, но затем я нажал «продолжить», и мое представление загрузки вступило во владение экран.
Я совершенно сбит с толку. Пожалуйста помоги!! Заранее большое спасибо за понимание.
Видео странного поведения:
Соответствующий код:
RootViewControllerMethods (это базовое представление для этого проекта TableView)
- (void)viewDidLoad {
//Start the Current Location controller as soon as the program starts. The Controller calls delegate methods
//that will update the list and refresh
[MyCLController sharedInstance].delegate = self;
[[MyCLController sharedInstance].locationManager startUpdatingLocation];
lv = [[LoadingViewController alloc] initWithNibName:@"Loading" bundle:nil];
[self.navigationController pushViewController:lv animated:YES];
[super viewDidLoad];
}
- (void)updateClicked {
//When the location is successfully updated the UpdateCells method will stop the CL manager from updating, so when we want to update the location
//all we have to do is start it up again. I hope.
[[MyCLController sharedInstance].locationManager startUpdatingLocation];
[self.navigationController pushViewController:lv animated:YES];
//LV is a class object which is of type UIViewController and contains my spinning globe/loading view.
}
-(void)updateCells {
//When the Core Location controller has updated its location it calls this metod. The method sends a request for a JSON dictionary
//to trailbehind and stores the response in the class variable jsonArray. reloadData is then called which causes the table to
//re-initialize the table with the new data in jsonArray and display it on the screen.
[[MyCLController sharedInstance].locationManager stopUpdatingLocation];
if(self.navigationController.visibleViewController != self) {
self.urlString = [NSString stringWithFormat:@"http://www.trailbehind.com/iphone/nodes/%@/%@/2/10",self.lat,self.lon];
NSURL *jsonURL = [NSURL URLWithString:self.urlString];
NSString *jsonData = [[NSString alloc] initWithContentsOfURL:jsonURL];
NSLog(@"JsonData = %@ \n", jsonURL);
self.jsonArray = [jsonData JSONValue];
[self.tableView reloadData];
[self.navigationController popToRootViewControllerAnimated:YES];
[jsonData release];
}
}
Методы CLController: в основном просто отправляет все данные прямо обратно в RootViewController
// Called when the location is updated
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
NSLog(@"New Location: %@ \n", newLocation);
NSLog(@"Old Location: %@ \n", oldLocation);
@synchronized(self) {
NSNumber *lat = [[[NSNumber alloc] init] autorelease];
NSNumber *lon = [[[NSNumber alloc] init] autorelease];
lat = [NSNumber numberWithFloat:newLocation.coordinate.latitude];
lon = [NSNumber numberWithFloat:newLocation.coordinate.longitude];
[self.delegate noteLat:lat];
[self.delegate noteLon:lon];
[self.delegate noteNewLocation:newLocation];
[self.delegate updateCells];
}
}