3

mkmapview に追加する注釈がたくさんあります。注釈を追加すると、アプリが短時間フリーズします。UI をビューに追加できる唯一のスレッドはメイン スレッドであることを理解しました。これが当てはまる場合、この操作でアプリがフリーズしないようにするにはどうすればよいですか?

// in viewdidLoad
for (NSManagedObject *object in requestResults) {
     CustomAnnotation *customAnnotation = [[CustomAnnotation alloc] init];
     customAnnotation.title = object.title;
     customAnnotation.coordinate = CLLocationCoordinate2DMake([object.latitude doubleValue], [object.longitude doubleValue]);
     [_mapView addAnnotation:customAnnotation];
} 
} // end viewdidload

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
// shows the annotation with a custom image
    MKPinAnnotationView *customPinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"mapAnnotation"];
    CustomAnnotation *customAnnotation = (id) annotation;
    customPinView.image = [UIImage imageNamed:@"green"];
    return customPinView;
}
4

2 に答える 2

2

さらに優れたシンプルな方法として、-[MKMapView addAnnotations:]個々の注釈の再計算のオーバーヘッドなしで一括追加することを確認してください。

于 2013-05-14T16:52:38.543 に答える
2

これを行うには、 Grand Central Dispatch - GCDを使用できます。

試してみてください:

- (void)viewDidLoad
{
  dispatch_async(dispatch_get_global_queue(0, 0), ^{
     for (NSManagedObject *object in requestResults)
     {
        CustomAnnotation *customAnnotation = [[CustomAnnotation alloc] init];
        customAnnotation.title = object.title;
        customAnnotation.coordinate = CLLocationCoordinate2DMake([object.latitude doubleValue], [object.longitude doubleValue]);
        dispatch_async(dispatch_get_main_queue(), ^{
           [_mapView addAnnotation:customAnnotation];
        });
     }
  });
}

これは素晴らしいチュートリアルです: GCD とスレッド化

于 2013-05-14T08:15:47.523 に答える