Мне нужно геокодировать тонну адресов с помощью CLGeocoder, не API Google.Геокодирование много адресов - CLGeocoder
Моя проблема заключается в том, что мой код добавляет только аннотацию для первого адреса в массиве ниже. Тем не менее, функция вызывается соответствующее число раз - блок просто запускается в первый адрес после того, как функция была вызвана для всех адресов:
- (void)mapPoints {
NSString *foo = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"names%d", self.indexOfSchool] ofType:@"plist"];
NSArray *description = [NSArray arrayWithContentsOfFile:foo];
NSString *bar = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d1", self.indexOfSchool] ofType:@"plist"];
NSArray *details = [NSArray arrayWithContentsOfFile:bar];
NSString *path = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d0", self.indexOfSchool] ofType:@"plist"];
NSArray *addresses = [NSArray arrayWithContentsOfFile:path];
self.saved = [NSMutableArray alloc] init];
for (int q = 0; q < addresses.count; q+= 20) {
[self annotate:[addresses objectAtIndex:q] detail:[details objectAtIndex:q] andDesc:[description objectAtIndex:q]];
}
}
see updated annotate: method below...
Вот как выглядят мои журналы:
Поэтому, хотя функция вызывается с помощью цикла, блок не работает для каких-либо результатов, отличных от первого.
Я знаю, что мои адреса хороши. Это не работает для любого числа (> 1) вызовов функции. += 20
в цикле не имеет ничего общего с построением только одной точки: это тоже не работает для ++
(также есть около 200 результатов).
Я довольно новичок в блоках, поэтому, надеюсь, это простое решение. Любая помощь очень ценится!
EDIT Делать это вместо:
- (void)annotate:(NSString *)address detail:(NSString *)detail andDesc:(NSString *)description {
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:address
completionHandler:^(NSArray* placemarks, NSError* error) {
if (placemarks && placemarks.count > 0) {
CLPlacemark *topResult = [placemarks objectAtIndex:0];
MKPlacemark *placemark = [[MKPlacemark alloc] initWithPlacemark:topResult];
MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
point.coordinate = placemark.coordinate;
point.title = description;
point.subtitle = [NSString stringWithFormat:@"%@ miles from origin", detail];
MKCoordinateRegion region = self.directionsView.region;
region.center = [(CLCircularRegion *)placemark.region center];
region.span.longitudeDelta /= 8.0;
region.span.latitudeDelta /= 8.0;
[self.directionsView addAnnotation:point];
NSLog(@"%@", point);
[self.directionsView setRegion:region animated:YES];
}
}
];
[self.saved addObject:geocoder];
NSLog(@"%@", geocoder);
}
... до сих пор тянет пустую карту без каких-либо аннотаций - даже не первый. Массив геокодера имеет различный адрес памяти при каждом вызове функции, так что часть, кажется, работает.
Я думаю, вы должны пойти с семафоров в ГКД. – Shmidt