2012-01-03 11 views
1

場所のタイトルと住所を取得し、次にGoogleマップcsvから座標を取得してアノテーションを追加するコードがあります。それはうまくいきますが、一度に50個以上の注釈を追加したい場合は、約30〜40秒間フリーズしてアノテーションを表示するので、私が知りたいのはメモリ管理を台無しにしたからですそれ以外は?私はそれをスピードアップできますか?ここでiPhone MapViewに複数の注釈を追加するのが遅い

はコードです:方法に従い

- (void) addAnnotation: (NSString*) annoTitle: (NSString*) annoAddress 
{ 
    NSString *address = annoAddress; 

    NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv", [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString]]; 
    NSArray *listItems = [locationString componentsSeparatedByString:@","]; 

    float langcoord = [[listItems objectAtIndex:2] floatValue]; 
    float longcoord = [[listItems objectAtIndex:3] floatValue]; 

    CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(langcoord, longcoord); 

    // Create an instance of MapPoint with the current data 
    Annotation *annotation = [[Annotation alloc] initWithCoordinate:coord title:annoTitle]; 

    // Add it to the map view 
    [mapView addAnnotation:annotation]; 

    // MKMapView retains its annotations, so we can release it 
    [annotation release]; 
} 
+0

私は 'stringWithContentsOfURL'メソッドは同期であり、それが終了するまでUIをブロックします – 1337code

+0

アプリと負荷50の注釈を開こうとすると今はクラッシュします。ループ内でこのメソッドを呼び出す場合、UIは長時間ブロックされます。ここにはいくつかの代替案があります:http://stackoverflow.com/questions/5850930/speed-up-addannotations-from-google-geocoding and http://stackoverflow.com/questions/7634246/for-loop-with- google-geocoding-high-error-rate-iphone – Anna

答えて

1

はMapKit上に複数のピンの使用です。

-(void)viewWillAppear:(BOOL)animated { 

    NSArray *AS=[NSArray arrayWithArray:[reports objectAtIndex:0]]; 
    for (int i=0; i<[AS count]; i++) { 
      Place* home = [[[Place alloc] init] autorelease]; 
home.name = [[AS objectAtIndex:i] valueForKey:@"comments"]; 
      home.latitude = [[[AS objectAtIndex:i] valueForKey:@"latitude"]floatValue]; 
      home.longitude = [[[AS objectAtIndex:i] valueForKey:@"longitude"]floatValue]; 
valueForKey:@"latitude"]floatValue],[[[AS objectAtIndex:i] valueForKey:@"longitude"]floatValue]]; 

      PlaceMark* from = [[[PlaceMark alloc] initWithPlace:home] autorelease]; 
      [mapView addAnnotation:from]; 
} 
    [self centerMap]; 

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 

一元地図

-(void) centerMap 
{ 
    MKCoordinateRegion region; 
    CLLocationDegrees maxLat = -90; 
    CLLocationDegrees maxLon = -180; 
    CLLocationDegrees minLat = 120; 
    CLLocationDegrees minLon = 150; 
    NSArray *temp=[NSArray arrayWithArray:[NSArray arrayWithArray:[reports objectAtIndex:0]]]; 
    for (int i=0; i<[temp count];i++) { 
     Place* home = [[[Place alloc] init] autorelease]; 
     home.latitude = [[[temp objectAtIndex:i] valueForKey:@"latitude"]floatValue]; 
     home.longitude =[[[temp objectAtIndex:i] valueForKey:@"longitude"]floatValue]; 

     PlaceMark* from = [[[PlaceMark alloc] initWithPlace:home] autorelease]; 

     CLLocation* currentLocation = (CLLocation*)from ; 
     if(currentLocation.coordinate.latitude > maxLat) 
      maxLat = currentLocation.coordinate.latitude; 
     if(currentLocation.coordinate.latitude < minLat) 
      minLat = currentLocation.coordinate.latitude; 
     if(currentLocation.coordinate.longitude > maxLon) 
      maxLon = currentLocation.coordinate.longitude; 
     if(currentLocation.coordinate.longitude < minLon) 
      minLon = currentLocation.coordinate.longitude; 

     region.center.latitude  = (maxLat + minLat)/2; 
     region.center.longitude = (maxLon + minLon)/2; 
     region.span.latitudeDelta = maxLat - minLat; 
     region.span.longitudeDelta = maxLon - minLon; 
    } 
    [mapView setRegion:region animated:YES]; 
} 

ピン2の間、ここで複数のアノテーションを定義します。

- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation 
{ 

    if (annotation == mapView.userLocation) 
     return nil; 

    MKPinAnnotationView *pin = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier: @"asdf"]; 

    if (pin == nil) 
     pin = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier: @"asdf"] autorelease]; 
    else 
     pin.annotation = annotation; 
     pin.userInteractionEnabled = YES; 
     UIButton *disclosureButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     [disclosureButton setFrame:CGRectMake(0, 0, 30, 30)]; 

     pin.rightCalloutAccessoryView = disclosureButton; 
     pin.pinColor = MKPinAnnotationColorRed; 
     pin.animatesDrop = YES; 
     [pin setEnabled:YES]; 
     [pin setCanShowCallout:YES]; 
     return pin; 
} 

More details and download the sample code here.

+0

良いコード、簡単に実装されています。乾杯! – Felipe

関連する問題