Добавить / перезагрузить аннотации mapview без блокировки основного потока - PullRequest
4 голосов
/ 07 февраля 2012

Я могу отлично загрузить свой вид карты с аннотациями в первый раз.Однако, если я пытаюсь перезагрузить карту нажатием кнопки (после того, как она уже загружена), пользователь должен ждать, пока процесс не завершится.Эта проблема возникла из-за того, что при перезагрузке новые аннотации не появляются до тех пор, пока представление карты не будет значительно перемещено, то есть, когда срабатывает viewForAnnotation .Я видел два других вопроса, похожих на мой, с решениями, включающими « executeSelectorInBackground » & « executeSelectorOnMainThread ».Первый не работал для меня :( и последний я не хочу делать (хотя это единственный вариант, который работает), так как я хочу, чтобы пользователь мог взаимодействовать с картой, пока аннотации загружаются, не блокируя основной поток. I 'Я знаю, что такие анимации лучше всего делать в главном потоке, поэтому вопрос (ы) 1. Нет ли другого способа сделать это, кроме как заставить пользователя ждать, пока карта перезагрузится? 2. Предложения о том, как сделать это лучше всего?Заранее спасибо.

1 Ответ

4 голосов
/ 07 февраля 2012

Вы можете использовать блок очереди отправки для достижения этой цели. вот синтаксис
Вы можете создать свою личную очередь следующим образом

dispatch_queue_t queue = dispatch_queue_create("com.MyApp.AppTask",NULL);
dispatch_queue_t main = dispatch_get_main_queue();
    dispatch_async(queue, 
    ^{
        //do the fetching of data here(Don't do any UI Updates)
        dispatch_async(main, 
        ^{
           // Do the UI Update here.
         });

     });

Apple называет это рекурсивным разложением.
В этом фрагменте кода вычисления выгружаются в фоновый поток с dispatch_async() и
затем dispatch_async() вернемся в основную очередь, которая запланирует запуск нашего блока с обновленными данными, которые мы вычислили в фоновом потоке.

...