これが私が使用しているコードのスニペットです。というモデルがありx_locator
ます。モデルをマルチスレッド化すると、maps.google.com は 620 エラーを返します (要求が多すぎて速すぎます) が、モデルをメイン スレッドに残すと問題なく動作します...要求が行われている間は UI だけがロックされます.
-(CLLocationCoordinate2D) getLocationFromAddressString:(NSString*) addressStr {
NSString *urlStr = [NSString stringWithFormat:@"http://maps.google.com/maps/geo? q=%@&output=csv",
[addressStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSString *locationStr = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlStr]];
NSArray *items = [locationStr componentsSeparatedByString:@","];
double lat = 0.0;
double lon = 0.0;
if([items count] >= 4 && [[items objectAtIndex:0] isEqualToString:@"200"]) {
lat = [[items objectAtIndex:2] doubleValue];
lon = [[items objectAtIndex:3] doubleValue];
}
else {
NSLog(@"Address, %@ not found: Error %@",addressStr, [items objectAtIndex:0]);
}
CLLocationCoordinate2D location;
location.latitude = lat;
location.longitude = lon;
return location;
}
編集:これが私がGCDを使用しようとした方法です...これは私のViewControllerにあります
- (void)viewDidLoad
{
[super viewDidLoad];
//set any delegates
self.locationManager.delegate = self;
[locationManager startUpdatingLocation];
fuelMapView.showsUserLocation = YES;
[self setInitialRegion];
locationManager.distanceFilter = 100;
//create the model
x_locator = [[Locator alloc]init];
x_locator.delegate = self;
dispatch_queue_t finder = dispatch_queue_create("Locator", NULL);
//if I do this, only some of the locations are found. If I leave it on the main thread, all locations are found.
dispatch_async(finder, ^{
[x_locator getUsersZipUsingLocation:[locationManager location]];
});
}
リバース ジオコーディングを使用してユーザーの郵便番号を取得し、(ユーザーの郵便番号に従って) 住所の配列を取得する別のメソッドを呼び出し、最後にこれらgetUsersZipUsingLocation:
の住所のそれぞれを次を使用して座標位置に変換するだけです。-(CLLocationCoordinate2D) getLocationFromAddressString:(NSString*) addressStr
編集2:人々が質問の焦点を失い、私のコーディングの優雅さを判断する可能性があるため、コード全体を投稿することを非常にためらっています....
とにかく...メソッドを呼び出す前に-(CLLocationCoordinate2D) getLocationFromAddressString:(NSString*) addressStr
、変数として渡すことができる形式にアドレスを組み立てる必要がありますaddressStr
。アドレスはバラバラに届くので、バラバラに組み立ててから、URLからデータを取得します...
NSString *urlStr = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv",
[addressStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
データが返されたら、私が言う[NSThread sleepForTimeInterval:0.05];
と、次のリクエストが実行されます。
私はあなたのコメントと時間に感謝します:)