2016-02-22 1 views
0

У меня есть массив аннотаций карты, которые я хочу добавить в MKMapView. Я хотел бы иметь возможность добавлять их по одному с небольшой паузой между каждым добавлением, поэтому я могу показать ход прошлой поездки. Глядя на компоненты MKMapView, я вижу два метода:Последовательное построение и отображение MKMapAnnotations на MKMapView

[self.mapView addAnnotation: ann]; 

и

[self.mapView addAnnotations: annArray]; 

Используя массив взрывает их всех там в то же время, так что я попробовал процесс зацикливание пытается оказать каждый аннотаций, как так

for (MapAnnotation *ann in _MapAnnotations) { 
     //Add custom annotation to map 
     [self.mapView addAnnotation: ann]; 

     //pause for 0.25 seconds 
     usleep(250000); 
    } 

Это не работает, либо - процесс приостанавливается в порядке, но не рендеринг не будет сделан, пока все точки не будут построены. Я попытался использовать оператор mapView setNeedsDisplay, чтобы заставить рендеринг карты, но не повезло. Есть идеи?

Благодаря Duncan, мой код теперь выглядит так, но я получаю сбои, когда я пытаюсь прокрутить прочь во время популяции, любые идеи?

Посмотреть уровень переменной

@private BOOL userScrolling; 

кнопка прокрутки

//Next Day Clicked 
- (IBAction)btnNext:(id)sender{ 
    //Move forward one day 
    userScrolling = YES; 
    [self setTheDate: 1]; 
} 

черчения код

userScrolling = NO; 


    [_MapAnnotations enumerateObjectsUsingBlock: ^(id object, 
                NSUInteger index, 
                BOOL *stop) 
    { 
     if (userScrolling){ *stop = YES;} 

     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 
             (int64_t)(index * 0.25 * NSEC_PER_SEC)), 
         dispatch_get_main_queue(),^
         { 
          if (!userScrolling){ 
           MapAnnotation *ann = _MapAnnotations[index]; 
           [self.mapView addAnnotation: ann]; 
           [self.mapView setNeedsDisplay]; 
          }else{ 
           *stop = YES; 
          } 

         } 
         );}]; 

ответ

1

Никогда, никогда, EVER использование сна на главном потоке вашего приложения. Это блокирует пользовательский интерфейс и предотвращает что-либо. Если вы спите основной поток более нескольких секунд, система убьет ваше приложение, думая, что оно висело.

Вместо этого используйте dispatch_after, чтобы добавить задержку между вызовами:

[_MapAnnotations enumerateObjectsUsingBlock: ^(id object, 
    NSUInteger index, 
    BOOL *stop) 
    { 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 
     (int64_t)(index * 0.25 * NSEC_PER_SEC)), 
     dispatch_get_main_queue(),^
    { 
     [self.mapView addAnnotation: ann]; 
    } 
    } 
]; 

Этот код петлями через массив аннотаций, добавив, каждый из которых после значения задержки, начиная с 0 и идет вверх по .25 секундными интервалами.

+0

спасибо за это - я получил его для работы с небольшими изменениями. Пожалуйста, извините наивность - я человек IOS, работающий неполный рабочий день, и это для меня все ново. Один вопрос - вот как выглядит мой код сейчас - это используется на экране, где пользователь может прокручиваться от данных, заполняемых до другого дня. Я устанавливаю логический уровень представления, который устанавливается, когда пользователь нажимает кнопку прокрутки - эта переменная тестируется, чтобы определить, следует ли остановиться или нет - см. Ниже. Я получаю аварии и не знаю, как это сделать - любые идеи? –

Смежные вопросы