我正在制作一个使用坐标数据的应用程序。我的应用程序将启动,而另一个应用程序必须通过不同的视图控制器才能进入此阶段。用户将在输入此特定 之前选择坐标路线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,那么最好的地方是哪里?
谢谢!