現在地のロケーションマネージャーを待つ方法は?
-
06-07-2019 - |
質問
現在の場所に基づいて最寄りのレストランを表示するiPhoneアプリケーションを開発しています そのためapplicationDidFinishLaunchingでこれをやっています:
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]);
}
}
問題のシナリオ。
ロケーションマネージャーはロケーションの更新を開始します
その前にウェブサービスが実行されるため、場所の値を取得できません。
私はデリゲートメソッドにWebサービスの呼び出しを入れているので、Webサービスが実行される前にアプリケーションが起動します。 デリゲートメソッドでは、適切な文字列で緯度と経度を設定しています。
問題は、ロケーションマネージャーがその場所を更新し、その場所をWebサービスに渡してからそのWebサービスを呼び出すまで、サービスが呼び出されないようにする方法です。
解決
CLLocationManagedにはデリゲートメソッドがあります。
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
CLLocationManagerが座標を受け取ると呼び出されます。または
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
locationManagerが座標を受信できない場合に呼び出されます。または、ユーザーが現在の場所を見つけられない場合。また、より正確な結果を受け取りたくない場合は、stopUpdatingLocationを呼び出す必要があります。
したがって、デリゲートメソッド内でリクエストを作成して、現在の場所を更新した後にのみ呼び出されるようにすることができます。
他のヒント
推奨されることの1つは、ヒントのSixten Ottoの代わりに、スレッドでurlRequestを実行することです。
私はあなたと同じように viewDidLoad
または viewDidAppear
でlocationManagerをセットアップします。次に、urlrequestを呼び出す2つの方法があります。
-
didUpdateToLocationデリゲートでリクエストを実行すると、場所が見つかった後にのみurlrequestが実行されることがわかります。これはMorionが提案したものです。
-
もう1つの方法は、didUpdateToLocationデリゲートに通知を送信して、場所が見つかったときに関数にurlRequestを実行するよう通知することです。この通知を設定するためのチュートリアルは、多くの人にとって非常に役立ちますプログラム。
また、前述したように、スレッドでurlrequestを実行する必要があります。その理由は、リクエストがロックされ、ユーザーがリクエストを終了するための制御ができなくなる可能性があるためです。これを行うには、NSOperationをセットアップして、 NSOperationQueue
に配置します。
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget: self
selector: @selector(METHOD:)
object: OBJECTorNIL;
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];
スレッドの詳細については、このチュートリアル