Ускорить надстройкуАннотации от Google Geocoding? - PullRequest
0 голосов
/ 01 мая 2011

В моем приложении есть следующий код, который добавляет несколько аннотаций к просмотру карты с помощью геокодирования Google:

for (PlaceObject *info in mapLocations) {

    NSString * addressOne = info.addressOne;
    NSString * name = info.name;

    NSString * address = [addressOne stringByAppendingString:@",London"];

    NSError * error;

    NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv", [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString ] encoding:NSASCIIStringEncoding error:&error];
    NSArray *listItems = [locationString componentsSeparatedByString:@","];

    double latitude = 0.0;
    double longitude = 0.0;

    if([listItems count] >= 4 && [[listItems objectAtIndex:0] isEqualToString:@"200"]) {
        latitude = [[listItems objectAtIndex:2] doubleValue];
        longitude = [[listItems objectAtIndex:3] doubleValue];

    } else {
        //Error handling

    }        

    CLLocationCoordinate2D coordinate;
    coordinate.latitude = latitude;
    coordinate.longitude = longitude;
    MyLocation *annotation = [[[MyLocation alloc] initWithName:name address:address coordinate:coordinate] autorelease];
    [mapViewLink addAnnotation:annotation];

}

Это работает, однако для появления представления требуется много времени, так как кажется, что оно ожидает, пока все объекты в массиве не пройдут циклически (их около 80).

Можно ли как-то загрузить представление, а затем добавить пины по мере их создания?

Ответы [ 3 ]

1 голос
/ 02 мая 2011

Как насчет этого:

for (PlaceObject *info in mapLocations) {

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{

        // GET ANNOTATION INFOS
        NSString * addressOne = info.addressOne;
        NSString * name = info.name;

        NSString * address = [addressOne stringByAppendingString:@",London"];

        NSError * error;

        NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv", [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

        NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString ] encoding:NSASCIIStringEncoding error:&error];
        NSArray *listItems = [locationString componentsSeparatedByString:@","];

        double latitude = 0.0;
        double longitude = 0.0;

        if([listItems count] >= 4 && [[listItems objectAtIndex:0] isEqualToString:@"200"]) {
            latitude = [[listItems objectAtIndex:2] doubleValue];
            longitude = [[listItems objectAtIndex:3] doubleValue];

        } else {
            //Error handling

        }        

        CLLocationCoordinate2D coordinate;
        coordinate.latitude = latitude;
        coordinate.longitude = longitude;
        MyLocation *annotation = [[[MyLocation alloc] initWithName:name address:address coordinate:coordinate] autorelease]; 

        dispatch_sync(dispatch_get_main_queue(), ^{

            // ADD ANNOTATION
            [mapViewLink addAnnotation:annotation];

        });

    });
}

Но, пожалуйста, попробуйте еще раз проверить этот код. Есть определенные вещи, которые вы должны сделать для обеспечения безопасности потоков и избегать EXC_BAD_ACCESS.

0 голосов
/ 02 мая 2011

Да, вы совершаете классическую ошибку, выполняя долгую работу (чистую загрузку с URL) в основном потоке (UI). Переместите эту работу в фоновый поток, а затем добавьте штифты в основной поток. Это может быть сделано несколькими способами, создав другой явный поток, GCD с блоками, или просто выполнить выборку в фоновом потоке. Проще всего, вероятно, выполнить Selector в фоновом режиме, а затем, когда ему есть, что добавить на карту, выполнитьSelector в основном потоке.

0 голосов
/ 02 мая 2011

Где этот код выполняется в вашем приложении?

Я бы рекомендовал использовать NSURLConnection и добавить аннотации после , когда данные были получены и проанализированы. Посмотрите здесь для получения дополнительной информации, если вы не знакомы с NSURLConnection: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

...