0

我正在使用 Apple 的 KMLViewer 加载 KML 文件并将其显示在 MapView 中。KML 文件中有超过 50,000 行坐标,这当然会导致加载缓慢。为了加快速度,我正在尝试使用 GCD 在另一个线程中执行解析。

只要它显示正确并且速度可以接受,我就让它工作得相当好。但是,加载地图时出现间歇性运行时错误。我怀疑这是因为我的布局方式是在 GCD 块中更新 UI。我正在阅读的所有内容都表明应该在主线程中更新 UI,否则可能会出现间歇性且难以追踪的运行时错误。嗯,这就是我所看到的。

问题是,我不知道如何在主线程中更新 UI。我对 iOS 编程还是新手,所以我只是把东西扔在墙上,看看有什么用。这是我的代码,基本上是 Apple 的 KMLViewerViewController.m 并进行了一些修改:

    #import "KMLViewerViewController.h"

@implementation KMLViewerViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    activityIndicator.hidden = TRUE;


    dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL);
    dispatch_async(myQueue, ^{

    // Locate the path to the route.kml file in the application's bundle
    // and parse it with the KMLParser.

        NSString *path = [[NSBundle mainBundle] pathForResource:@"BigMap" ofType:@"kml"];
        NSURL *url = [NSURL fileURLWithPath:path];
        kmlParser = [[KMLParser alloc] initWithURL:url];
        [kmlParser parseKML];

        dispatch_async(dispatch_get_main_queue(), ^{

    // Update the UI


    // Add all of the MKOverlay objects parsed from the KML file to the map.
    NSArray *overlays = [kmlParser overlays];
    [map addOverlays:overlays];

    // Add all of the MKAnnotation objects parsed from the KML file to the map.
    NSArray *annotations = [kmlParser points];
    [map addAnnotations:annotations];



    // Walk the list of overlays and annotations and create a MKMapRect that
    // bounds all of them and store it into flyTo.
    MKMapRect flyTo = MKMapRectNull;
    for (id <MKOverlay> overlay in overlays) {
        if (MKMapRectIsNull(flyTo)) {
            flyTo = [overlay boundingMapRect];
        } else {
            flyTo = MKMapRectUnion(flyTo, [overlay boundingMapRect]);
        }
    }

    for (id <MKAnnotation> annotation in annotations) {
        MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0);
        if (MKMapRectIsNull(flyTo)) {
            flyTo = pointRect;
        } else {
            flyTo = MKMapRectUnion(flyTo, pointRect);
        }
    }

    // Position the map so that all overlays and annotations are visible on screen.
    map.visibleMapRect = flyTo;

        });
    });

}

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    activityIndicator.hidden = FALSE;
    [activityIndicator startAnimating];
}


#pragma mark MKMapViewDelegate

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    return [kmlParser viewForOverlay:overlay];
}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    return [kmlParser viewForAnnotation:annotation];
}

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
    [activityIndicator stopAnimating];
    activityIndicator.hidden = TRUE;
}


@end

建议?

4

0 回答 0