gpt4 book ai didi

ios - 构建 MapView 注释非常慢

转载 作者:行者123 更新时间:2023-11-29 12:48:00 24 4
gpt4 key购买 nike

我有一个应用程序,它在 MapView 中显示大约 100 个注释(带有自定义图钉图像、标注附件和注释图像)。在构建注释时,我在注释和构建之间存储了一个链接,这样我就可以分配正确的构建并在之后打开正确的 segue。

在 iOS 6 中,它们的构建速度非常快,我在添加它们时还启用了动画,因此一个图钉一个接一个地掉落,但在 iOS7 中,这不再可能了(?)。现在,在我的 iPhone 4S 上构建这 100 个注释需要超过 1 秒,这太长了。有什么办法可以改进代码吗?

- (void)viewDidLoad

...

//creating annotations
annotationlink = [[NSMutableArray alloc] init];

for (int i = 0; i < data.count; i++) {
NSDictionary *dataItem = [data objectAtIndex:i];

//storing annotation in array for link
Annotation *buildingannotation = [[Annotation alloc] init];
NSNumber *index = [NSNumber numberWithInteger:i];
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:index, indexKey, buildingannotation, annotationKey, nil];
[annotationlink addObject:dict];

buildingannotation.title = [dataItem objectForKey:@"Building"];
buildingannotation.subtitle = [dataItem objectForKey:@"Info"];

MKCoordinateRegion buildingcoordinates;
buildingcoordinates.center.latitude = [[dataItem objectForKey:@"Latitude"] floatValue];
buildingcoordinates.center.longitude = [[dataItem objectForKey:@"Longitude"] floatValue];
buildingannotation.coordinate = buildingcoordinates.center;

[self.mapView addAnnotation:buildingannotation];
}


- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]]){
return nil;
}

MKAnnotationView *pinView = (MKAnnotationView *)
[self.mapView dequeueReusableAnnotationViewWithIdentifier:pinIdentifier];

MKAnnotationView *customAnnotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinIdentifier];
customAnnotationView.canShowCallout = YES;

//right button to detail view
UIButton* disclosureButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
customAnnotationView.rightCalloutAccessoryView = disclosureButton;

//left button for image
NSInteger *buildingindex = [self getIndex:annotation];
NSDictionary *dataItem = [data objectAtIndex:buildingindex];
NSString* filename = [dataItem objectForKey:@"Thumb"];
filename = [filename stringByAppendingString:@"@2x.jpg"];

NSString* resourceimagePath = [resourcePath stringByAppendingPathComponent:filename];
Image = [UIImage imageWithContentsOfFile:resourceimagePath];

UIImageView *AnnotationThumb = [[UIImageView alloc] initWithImage:Image];
AnnotationThumb.frame = CGRectMake(0, 0, 31, 31);
customAnnotationView.leftCalloutAccessoryView = AnnotationThumb;

//annotation image
customAnnotationView.image = [UIImage imageNamed:@"Annotation_white.png"];

return customAnnotationView;
return pinView;
}

以下函数使用 nspredicate 获取当前注释的索引,以使用字典过滤数组。这样做的好处是,我也可以在 calloutAccessoryControlTapped 时使用它:

-(NSInteger*) getIndex:(Annotation*)searchannotation
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", annotationKey, searchannotation];
NSArray *filteredarray = [annotationlink filteredArrayUsingPredicate:predicate];
NSDictionary *building = [filteredarray objectAtIndex:0];
NSInteger *buildingIndex = [[building objectForKey:indexKey] integerValue];
return buildingIndex;
}

对于 iPhone 4S,最后一个图钉是在 View 加载后 1.14 秒构建的。

如果我手动搜索注释链接数组而不是像这样使用 nspredicate 函数:

//left button for image
int buildingIndex;
for (int i = 0; i < annotationlink.count; i++) {
NSDictionary *annotationDict = [annotationlink objectAtIndex:i];
if ([[annotationDict objectForKey:annotationKey] isEqual:annotation]) {
buildingIndex= [[annotationDict objectForKey:indexKey] integerValue];
i = annotationlink.count;
}
}

NSDictionary *dataItem = [data objectAtIndex:buildingIndex];

日志显示最后一个 pin 是在 viewDidLoad 之后 1.89 秒构建的。

如果我在 viewDidApper 而不是 viewDidLoad 中创建注释,则 View 会立即显示偏离路线,但背景需要一些时间来加载,所以直到引脚被丢弃之前一切都是灰色的,这也不是很好......

最佳答案

谢谢安娜的建议!我实现了这样的改进:

注释.h:

#import <MapKit/MKAnnotation.h> 

@interface Annotation : NSObject <MKAnnotation> {}
@property(nonatomic, assign) CLLocationCoordinate2D coordinate;
@property(nonatomic, copy) NSString *title;
@property(nonatomic, copy) NSString *subtitle;
@property NSInteger *ID;
@end

注释.m:

#import "Annotation.h" 

@implementation Annotation
@synthesize coordinate, title, subtitle, ID;
@end

ViewDidAppear:

//creating annotations 
for (int i = 0; i < data.count; i++) {
NSDictionary *dataItem = [data objectAtIndex:i];
Annotation *buildingannotation = [[Annotation alloc] init];
buildingannotation.ID = i;
buildingannotation.title = [dataItem objectForKey:@"Building"];
buildingannotation.subtitle = [dataItem objectForKey:@"Subtitle"];

MKCoordinateRegion buildingcoordinates;
buildingcoordinates.center.latitude = [[dataItem objectForKey:@"Latitude"] floatValue];
buildingcoordinates.center.longitude = [[dataItem objectForKey:@"Longitude"] floatValue];
buildingannotation.coordinate = buildingcoordinates.center;

[self.mapView addAnnotation:buildingannotation];
}

viewForAnnotation:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]]){
return nil;
}

MKAnnotationView *pinView = (MKAnnotationView *)
[self.mapView dequeueReusableAnnotationViewWithIdentifier:pinIdentifier];

if (pinView == nil) {
MKAnnotationView *customAnnotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinIdentifier];
customAnnotationView.canShowCallout = YES;

//right button to detail view
UIButton* disclosureButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
customAnnotationView.rightCalloutAccessoryView = disclosureButton;

//left button for image
Annotation *buildingAnnotation = (Annotation *)annotation;
NSInteger *buildingindex = buildingAnnotation.ID;

NSString *filePath = [thumbname objectAtIndex:buildingindex];
UIImageView *AnnotationThumb = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:filePath]];
AnnotationThumb.frame = CGRectMake(0, 0, 31, 31);
customAnnotationView.leftCalloutAccessoryView = AnnotationThumb;

//annotation image
customAnnotationView.image = [UIImage imageNamed:@"Annotation_white.png"];

return customAnnotationView;
} else {
pinView.annotation = annotation;
}

return pinView;
}

标注:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
Annotation *buildingAnnotation = (Annotation *)view.annotation;
selectedbuilding = buildingAnnotation.ID;
[self performSegueWithIdentifier:@"DetailViewController" sender:self];
}

显示所有注释还需要一些时间。有机会进一步改进代码吗?

关于ios - 构建 MapView 注释非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23152156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com