向iPhone MapView添加多个注释很慢

时间:2012-01-03 10:48:20

标签: iphone annotations android-mapview

我有一个代码,它获取一个位置的标题和地址,然后从谷歌地图csv获取坐标,然后添加注释。它可以工作,但是当我想一次添加50个或更多注释时它冻结大约30-40秒然后显示注释,所以我想知道的是我搞砸了内存管理,这就是为什么它太慢了,或者是什么东西其他?我可以加快速度吗?

以下是代码:

- (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];
}

1 个答案:

答案 0 :(得分: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];
}

在此处定义多个注释。

- (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.