Блочная версия executeSelectorOnMainThread: withObject: waitUntilDone: - PullRequest
7 голосов
/ 21 февраля 2012

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

У меня есть наблюдатели, которые могут получать события, которые не генерируются в главном потоке. Я хочу, чтобы действие выполнялось в главном потоке, если он в первую очередь ориентирован на пользовательский интерфейс. Прямо сейчас мне нужно написать два метода для этого, один из которых является наблюдателем событий, а второй - кодом, который должен выполняться в главном потоке.

Я бы хотел объединить все это в один метод, если бы мог.

Ответы [ 2 ]

13 голосов
/ 21 февраля 2012

GCD должен выполнить трюк:

dispatch_sync(dispatch_get_main_queue(), ^{
    // Do stuff here
});

или dispatch_async, если вы планируете waitUntilDone:NO.* * * * * * * * * * * Основная очередь гарантированно работает в главном потоке , поэтому она безопасна для операций пользовательского интерфейса.

12 голосов
/ 21 февраля 2012

Предпочтительная технология для поддержки многопоточности с поддержкой блоков называется Grand Central Dispatch. Пример кода можно найти в Википедии и в справочнике Grand Central Dispatch (GCD)

dispatch_async(backgroundQueue, ^{
        //background tasks

        dispatch_async(dispatch_get_main_queue(), ^{
            //tasks on main thread
        });    
});
...