0

我正在制作一个使用坐标数据的应用程序。我的应用程序将启动,而另一个应用程序必须通过不同的视图控制器才能进入此阶段。用户将在输入此特定 之前选择坐标路线UIViewController

我目前,为了测试目的,所有这些都在viewDidLoad. 此视图控制器的目的是显示MKPolyline基于预定路线的地图。将MKPolyline是基于一个因子的梯度,在这种情况下,velocity

GradientPolylineOverlay来自https://github.com/wdanxna/GradientPolyline带有 MapKit ios 的 Gradient Polyline

我的主要问题是,就我的代码而言,渲染MKPolyline速度非常慢,并且任何事件mapView都缓慢且滞后。

我已经确定,因为我有很多坐标(这很容易超过 7000),以下两行之一导致了问题: [mapView addOverlay:polyline]; [self.view addSubview:mapView];

- (void)viewDidLoad
{
    [super viewDidLoad];
    data = delegate.data; // contains sorted/parse data from my source
    NSInteger pointsCount = [data sampleCount];

    // set up mapView
    mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
    mapView.delegate = self;
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(*[data getGPSCoordinatesForSample:0], 500, 500);
    [mapView setRegion:region];

    CLLocationCoordinate2D pointsToUse[pointsCount];

    float* velocity =0;
    velocity = malloc(sizeof(float)*pointsCount);

    // pointCount contains 7000 coordinates!
    for(int i = 0; i < pointsCount; i++) {
            CGPoint p = CGPointMake([data getGPSCoordinatesForSample:i]->latitude,[data getGPSCoordinatesForSample:i]->longitude);
            pointsToUse[i] = CLLocationCoordinate2DMake(p.x,p.y);
            velocity[i] =[data getGPSVelocityForSample:i];
    }


    polyline = [[GradientPolylineOverlay alloc] initWithPoints:pointsToUse velocity:velocity count:pointsCount];

    // issues!
    [mapView addOverlay:polyline];
    [self.view addSubview:mapView];
    free(velocity);
}

我被引导相信这一点,为了提高性能,我应该使用 Grand Central Dispatch。使用 GCD,我将代码更改为:

dispatch_queue_t queue = dispatch_queue_create("Test", 0);
dispatch_async(queue, ^{

    CLLocationCoordinate2D pointsToUse[pointsCount];


    float* velocity =0;
    velocity = malloc(sizeof(float)*pointsCount);

    // pointCount contains 7000 coordinates!
    for(int i = 0; i < pointsCount; i++) {
        CGPoint p = CGPointMake([data getGPSCoordinatesForSample:i]->latitude,[data getGPSCoordinatesForSample:i]->longitude);
        pointsToUse[i] = CLLocationCoordinate2DMake(p.x,p.y);
        velocity[i] =[data getGPSVelocityForSample:i];
    }


    polyline = [[GradientPolylineOverlay alloc] initWithPoints:pointsToUse velocity:velocity count:j];
    [mapView addOverlay:polyline]; // Crash
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.view addSubview:mapView];
    });
});

[mapView addOverlay:polyline];发出Thread 4: EXC_BAD_ACCESS调试错误。

我理想的解决方案必须使用所有坐标,但如果需要,我可以按比例缩小。如果我可以在代码中的某个地方使用 GCD,那么最好的地方是哪里?

谢谢!

4

1 回答 1

0

我认为mapView:rendererForOverlayormapViewDidFinishLoadingMap是一个不错的选择。

它们都在 MKMapViewDelegate 中。

这是文件。

于 2014-03-13T04:24:25.183 回答