HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了iphone – 为MKMapView优化代码 – 大量注释大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我的应用程序中有一个模态视图,显示UIMapView.然后我将大量注释(超过800)添加到此地图视图(下面的代码).

问题是当所有引脚加载时,用户被迫等待一分钟左右.一旦所有800个引脚都在地图上,应用程序也会变得迟钝.

任何人都可以建议我如何改进下面的代码

谢谢.

#import "MapView.h"
#import "MapPlaceObject.h"


@implementation MapView
@synthesize mapViewLink,mapLOCATIOns,detail,FailedLoad;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundLeorNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundLeorNil];
if (self) {
    // Custom initialization
}
return self;
}

-(void)addPins
{

for (MapPlaceObject * info in mapLOCATIOns) {


    double latitude = info.longitude;
    double longitude = info.latitude;

    NSString * name = info.name;
    NSString * addressline = info.addressOne;
    NSString * postcode = info.postCode;

    NSString * addresscomma = [addressline StringByAppendingString:@","];
    NSString * address = [addresscomma StringByAppendingString:postcode];

    CLLOCATIOnCoordinate2D coordinate;
    coordinate.latitude = latitude;
    coordinate.longitude = longitude;
    MyLOCATIOn *Annotation = [[[MyLOCATIOn alloc] initWithName:name address:address coordinate:coordinate] autorelease];


    [mapViewLink addAnnotation:Annotation];

}
}

- (void)showLinks : (id)sender {


if (UI_user_iNTERFACE_I@L_714_7@m() == UIUserInterfaceI@L_714_7@mPad) {
    detail = [[DetailViewController alloc] initWithNibName:@"DetailViewController-iPad" bundle:nil];
} 

else if (!detail) {

    NSLog(@"Detail is None");

    detail = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; 

}

int uniquEID = ((UIButton *)sender).tag;

//PlaceObject *info = [mapLOCATIOns objectATindex:uniquEID];

detail.UniquEID = uniquEID;
detail.hidesBottomBarWhenPushed = YES;

[self.navigationController pushViewController:detail animated:YES];

self.detail = nil;

[detail release];

}

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

if (Annotation == mapView.userLOCATIOn){
    return nil; //default to blue dot
}    

MKPinAnnotationView *AnnView=[[MKPinAnnotationView alloc] initWithAnnotation:Annotation reusEIDentifier:@"currentloc"];
AnnView.pinColor = MKPinAnnotationColorRed;

nameSaved = Annotation.title;

for (PlaceObject * info in mapLOCATIOns) {

    if (info.name == nameSaved) {

        savEID = info.UniquEID;

    }
}

UIButton *advertButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
advertButton.frame = CGRectMake(0,23,23);
advertButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
advertButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;

[advertButton addTarget:self action:@SELEctor(showLinks:) forControlEvents:UIControlEventTouchUpInside];

advertButton.tag = savEID;

AnnView.rightCalloutAccessoryView = advertButton;

AnnView.animatesDrop=TRUE;
AnnView.canShowCallout = YES;
AnnView.calloutOffset = CGPointMake(-5,5);
return AnnView;

}

- (void)dealloc
{
[mapViewLink release];
[mapLOCATIOns release];
[detail release];
self.FailedLoad = nil;
[FailedLoad release];
[super dealloc];
}

- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data,images,etc that aren't in use.
}

- (void)viewWillAppear:(BOOL)animated {

if (firstTimE) {

    CLLOCATIOnCoordinate2D zoomLOCATIOn;

    zoomLOCATIOn.latitude = 51.50801;
    zoomLOCATIOn.longitude = -0.12789;

    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLOCATIOn,15*METERS_PER_MILE,15*METERS_PER_MILE);

    MKCoordinateRegion adjustedRegion = [mapViewLink regionThatFits:viewRegion];                

    [mapViewLink setRegion:adjustedRegion animated:YES];  

    firstTime = NO;

}    
}

- (void)viewDidLoad
{
[super viewDidLoad];

firstTime = YES;

FailedLoad = [[NSMutableArray alloc]init];

self.mapLOCATIOns = [BluePlaqueDatabase database].mapInfo;

[self addPins];
}

- (void)viewDidUnload
{
[mapViewLink release];
mapViewLink = nil;
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

解决方法

您可以在这里进行两项最大的速度提升:

>实现注释视图重用(现在它每次需要显示注释时都会创建一个新视图,即使再次进入视图也是如此).
>更改UniquEID的设置方式.为了设置它,代码当前在每次创建注释视图时循环遍历所有注释(这可能在地图视图被缩放或滚动时发生 – 而不仅仅是初始时间).

首先,不是在viewForAnnotation方法搜索UniquEID并使用按钮标记来传递注释标识符,而是将uniquEID作为属性添加自定义注记类MyLOCATIOn,并在addPins中添加注释本身时设置属性

Annotation.uniquEID = info.UniquEID;  // <-- give id to Annotation itself
[mapViewLink addAnnotation:Annotation];

您还可以将uniquEID作为参数添加到initWithName方法,而不是单独分配属性.

接下来,要实现注释视图重用,viewForAnnotation方法应如下所示:

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

    if (Annotation == mapView.userLOCATIOn){
        return nil; //default to blue dot
    }    

    NSString *reusEID = @"StandardPin";
    MKPinAnnotationView *AnnView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reusEID];
    if (AnnView == nil)
    {
        AnnView = [[[MKPinAnnotationView alloc] initWithAnnotation:Annotation reusEIDentifier:reusEID] autorelease];

        AnnView.pinColor = MKPinAnnotationColorRed;
        AnnView.animatesDrop = YES;
        AnnView.canShowCallout = YES;
        AnnView.calloutOffset = CGPointMake(-5,5);

        UIButton *advertButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        advertButton.frame = CGRectMake(0,23);
        advertButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        advertButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;

        AnnView.rightCalloutAccessoryView = advertButton;
    }
    else
    {
        //update the Annotation property if view is being re-used...
        AnnView.Annotation = Annotation;
    }

    return AnnView;
}

最后,要响应按钮按下并找出显示详细信息的UniquEID,请实现calloutAccessoryControlTapped委托方法

- (void)mapView:(MKMapView *)mapView AnnotationView:(MKAnnotationView *)view 
            calloutAccessoryControlTapped:(UIControl *)control
{
    MyLOCATIOn *myLoc = (MyLOCATIOn *)view.Annotation;

    int uniquEID = myLoc.uniquEID;

    NSLog(@"calloutAccessoryControlTapped,uid = %d",uniquEID);

    //create,init,and show the detail view controller here...
}

所有这些更改之后,只有注释的初始加载将占用大部分时间.如果这仍然是一个问题,一种解决方案是仅添加在当前显示的区域中可见的注释,并在用户更改可见区域时添加/删除注释.

大佬总结

以上是大佬教程为你收集整理的iphone – 为MKMapView优化代码 – 大量注释全部内容,希望文章能够帮你解决iphone – 为MKMapView优化代码 – 大量注释所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。