Как ждать диспетчера местоположения для текущего местоположения? - PullRequest
2 голосов
/ 28 октября 2009

Я разрабатываю приложение для iPhone, в котором хочу показать ближайшие рестораны в зависимости от текущего местоположения. Для этого в приложении DidFinishLaunching я делаю это:

self.locationManager = [[CLLocationManager alloc] init];

    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];



    NSURL *url = [[NSURL alloc] initWithString:@"http://192.168.0.150/server1/Service.asmx/nearest?lat1=23.013163&lon1=72.559068"];
    NSMutableURLRequest* request2=[NSMutableURLRequest requestWithURL:url];
    [request2 setHTTPMethod:@"GET"]; 
    [request2 setTimeoutInterval:10];
    NSURLResponse *response=nil;
    NSError *err=nil;
    NSData *data1=[[NSURLConnection sendSynchronousRequest:request2 returningResponse:&response error:&err] retain];
    if(data1 == nil)
    {
        UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"The network is not available.\n Please check the Internet connection." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        [alert release];

    }
    else
    {
        NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data1];

        //Initialize the delegate.
        XMLParser *parser = [[XMLParser alloc] initXMLParser];

        //Set delegate
        [xmlParser setDelegate:parser];

        //Start parsing the XML file.
        @try {
            BOOL success = [xmlParser parse];
            if(success)
                NSLog(@"No Errors");
            else
                NSLog(@"Error Error Error!!!");
        }
        @catch (NSException * e) {
            NSLog(@"Exception in parsing %@  %@",[e name], [e reason]);
        }
    }

Сценарий проблемы.

менеджер местоположений начинает обновлять местоположение

Веб-служба выполняется до этого, поэтому я не могу получить значения местоположения.

Я помещаю вызов веб-службы в метод делегата, после чего приложение запускается до запуска веб-службы. в методе делегата я устанавливаю широту и долготу в соответствующих строках.

Проблема заключается в том, как обеспечить, чтобы служба не вызывалась до тех пор, пока менеджер местоположений не обновит это местоположение, а затем не передаст местоположение в веб-службу и затем не вызовет эту веб-службу.

Ответы [ 2 ]

6 голосов
/ 28 октября 2009

CLLocationManaged имеет метод делегата.

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

он будет вызван, когда CLLocationManager получит некоторые координаты. Или

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

он будет вызван, когда locationManager не может получить какие-либо координаты. Или когда пользователь не позволяет найти текущее местоположение. Также вам следует вызвать stopUpdatingLocation, если вы не хотите получать более точные результаты.

Таким образом, вы можете сделать свой запрос внутри метода делегата, чтобы быть уверенным, что он будет вызван только после обновления текущего местоположения.

2 голосов
/ 25 ноября 2009

Одна вещь, которую я бы порекомендовал, это сделать ваш urlRequest в виде ветки, как намекнул Сикстен Отто.

Я бы настроил locationManager в viewDidLoad или viewDidAppear, как у вас. Тогда есть два способа, которыми я бы назвал urlrequest:

  1. Если запрос будет выполнен в делегате didUpdateToLocation, тогда вы будете знать, что ваш URL-запрос будет выполняться только после того, как будет найдено местоположение. Это предположение, которое сделал Морион.

  2. Другой способ заключается в получении уведомления в делегате didUpdateToLocation, чтобы при обнаружении расположения он уведомлял функцию для выполнения urlRequest. Найдите этот Учебник для настройки уведомлений, это очень полезно и полезно знать для многих программ.

Также, как я упоминал ранее, вы должны выполнить urlrequest в потоке. Причина в том, что ваш запрос может быть заблокирован, и ваш пользователь не сможет контролировать запрос. Для этого настройте NSOperation и поместите его в NSOperationQueue:

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget: self 
                                                                                selector: @selector(METHOD:) 
                                                                                  object: OBJECTorNIL;
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        [queue addOperation:operation];

для получения дополнительной информации о потоках, посмотрите этот учебник

...