0

私は、Objective-C の経験が数か月しかありません。

顧客住所のリストを検索し、これらの住所の注釈を表示するコードがあります。顧客は多くの地域をカバーしているため、マップ ビューの中心とスパンを結果に合わせて調整したいと考えています。

したがって、検索されたすべての場所のマークを記録し、平均緯度と経度を計算することにしました。以下は私のコードです

self.mapView.mapType = MKMapTypeStandard; 
for (Customer *customer in customers) {
    CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
    NSString *customerAddress = [Customer getWholeAddressOfCustomer:customer];
    NSString *color = @"";
    if([customer.status isEqualToString:@"1"])
    {
        color = @"Green";
    }else if ([customer.status isEqualToString:@"2"]) {
        color = @"Yellow";
    }else if ([customer.status isEqualToString:@"3"])
    {
        color = @"Red";
    }else {
        color = customer.status;
    }
    [geoCoder geocodeAddressString:customerAddress completionHandler:^(NSArray *placemarks, NSError *error) 
     {
         [NSThread sleepForTimeInterval:0.25];
         if (placemarks.count == 0)
         {

             NSLog(@"No place for customer %@ was found",customerAddress);
         }

         CLPlacemark *placemark = [placemarks objectAtIndex:0];

         if(placemark.location.coordinate.latitude != 0.000000 && placemark.location.coordinate.longitude != 0.000000)
         {
             CustomerAnnotation *annotation = [[CustomerAnnotation alloc]initWithCoordinate:placemark.location.coordinate andName:customer.name andNumber:customer.customerNo andColor:color];  

             [self.mapAnnotations addObject:annotation];

         }

     }];

}
CLLocationDegrees totalLatitude=0;
CLLocationDegrees totalLongitude = 0;
for (int i=0; i < [self.mapAnnotations count]; i++) {
    totalLatitude += [(CustomerAnnotation *)[self.mapAnnotations objectAtIndex:i] coordinate].latitude;
    totalLongitude += [(CustomerAnnotation *)[self.mapAnnotations objectAtIndex:i] coordinate].longitude;
    [self.mapView addAnnotation:[self.mapAnnotations objectAtIndex:i]];

}

MKCoordinateRegion focusRegion;
focusRegion.center.latitude = totalLatitude/[self.mapAnnotations count];
focusRegion.center.longitude = totalLongitude/[self.mapAnnotations count];
focusRegion.span.latitudeDelta = 20; //will modify this parameter later to self adapt the map
focusRegion.span.longitudeDelta = 20;
[self.mapView setRegion:focusRegion animated:YES];

しかし、問題は この問題のようなタイミングの問題です

setRegion は、それらのプレース マークを取得する前に実行されます。そのリンクで提起されたソリューションでは、完了ブロックでメソッドを呼び出す必要があります。ただし、Region を設定する前にすべての場所マークをメソッドに追加する必要があるため、このソリューションは複数の住所の問題には適していません。

geocodeAddressString からすべての結果を取得した後にメソッドを実行する方法はありますか?

前もって感謝します。

4

1 に答える 1

0

問題は解決された。

ブロックの外では、カウンターを使用して、追加された注釈を記録しました。

__block int customerCount = 0; 

この数が整数に等しい場合、すべての顧客の中央領域にオート フォーカスします。

if (customerCount == [customers count]) {
   //Set the focus
}
于 2012-09-05T08:57:19.533 に答える