Frage

Ich entwickle eine iPhone-Anwendung, in der ich nächste Restaurants basierten zeigen will auf dem aktuellen Standort Dafür Im applicationDidFinishLaunching mache ich das:

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]);
        }
    }

Das Problem Szenario.

der Standort-Manager starten Sie den Standort Aktualisieren

Der Webservice vorher ausgeführt wird, so kann ich nicht auf die Positionswerte erhalten.

ich mir den Web-Service-Aufruf in der Delegatmethode bin setze dann startet die Anwendung, bevor der Webdienst ausgeführt wird. in der Delegatmethode setze ich die Breite und Länge in den entsprechenden Saiten.

Das Problem ist, dass, wie sicher, dass der Dienst nicht, bis der Standort-Manager, der Standort aktualisiert aufgerufen werden und dann die Lage an den Webdienst übergeben und dann das Web-Service aufrufen ..

War es hilfreich?

Lösung

CLLocationManaged hat die delegierte Methode.

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

es wird aufgerufen, wenn CLLocationManager werden einige Koordinaten erhalten. Oder

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

es wird aufgerufen, wenn Locationmanager kann keine Koordinaten erhalten. Oder, wenn der Benutzer nicht zulassen aktuellen Standort zu finden. Auch sollten Sie stopUpdatingLocation nennen, wenn Sie nicht um genauere Ergebnisse erhalten möchten.

So können Sie Ihre Anfrage innerhalb Delegatmethode machen kann sicher sein, wird erst nach der Aktualisierung aktueller Standort aufgerufen werden.

Andere Tipps

Eine Sache, die ich empfehlen würde, ist Ihre urlRequest in einem Thread zu tun, anstatt wie Sixten Otto angedeutet.

Ich würde Setup die Locationmanager in viewDidLoad oder viewDidAppear wie Sie haben. Dann gibt es zwei Möglichkeiten, ich würde das URLRequest nennen:

  1. Haben Sie die Anfrage in didUpdateToLocation Delegierten durchgeführt werden, dann werden Sie wissen, dass Ihr URLRequest wird nur ausgeführt werden, nachdem der Standort gefunden wird. Dies ist der Vorschlag, dass Morion gemacht.

  2. Die andere Möglichkeit, eine Benachrichtigung in den didUpdateToLocation Delegierten zu haben, ist so, dass, wenn der Standort gefunden wird, benachrichtigt er die Funktion, die urlRequest.Look bis dieser Tutorial für Benachrichtigungen einrichten, ist es sehr hilfreich und gut für eine Menge zu wissen Programme.

Auch, wie ich bereits erwähnt, sollen Sie einen URLRequest in einem Thread ausführen. Der Grund dafür ist, Ihre Anfrage gesperrt werden könnte und Ihre Benutzer würden keine Kontrolle haben, die Anforderung zu beenden. Um dies zu tun, wird Setup ein NSOperation und legen Sie sie in der NSOperationQueue:

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

für mehr Einfädeln Info, sieht diese Tutorial

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top