2015-06-03 2 views
1

Я надеюсь узнать, есть ли какие-либо негативные последствия запуска асинхронного NSURLConnection внутри отправки. Я использую отправку, потому что она кажется намного более чистой, чем таймер для моих целей.Выполняет ли диспетчер_после блокировки пользовательского интерфейса?

Звонок является асинхронным, но я хочу, чтобы использование dispatch_after не блокировало пользовательский интерфейс. Может кто-нибудь помочь мне понять, если dispatch_after заблокирует пользовательский интерфейс/приложение каким-либо образом за эти 10 секунд? Спасибо!

int delaySeconds = 10; 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delaySeconds 
* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 

    aURL = [NSURL URLWithString:@"http://google.com"]; 
    request = [NSMutableURLRequest requestWithURL:aURL 
             cachePolicy:NSURLRequestUseProtocolCachePolicy 
            timeoutInterval:60.0]; 

    [NSURLConnection sendAsynchronousRequest:request queue: 
    [NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response) { 

     //do something with response 

    }]; 

}); 

P.S. Я взглянул на Does dispatch_after block the main thread?, но я все еще немного смущен.

ответ

3

Код внутри dispatch_after не блокирует ничего, пока он фактически не запустится после задержки. Затем он запускается в указанной очереди.

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

Но этот пример плохой. В то время как создание NSURL и NSURLRequest выполняется в основном потоке, фактическое выполнение запроса выполняется асинхронно, поэтому основной поток не блокируется во время запроса. Только после того, как вызывается обработчик завершения, вы снова возвращаетесь к основному потоку. Но это связано с тем, что вы задаете основную очередь для блока завершения, а не потому, что dispatch_after выполняется в основном потоке.

Таким образом, единственным реальным кодом, выполняемым на основном потоке, является блок завершения NSURLConnection. Фактический запрос выполняется в фоновом режиме (поскольку он является асинхронным). Другой код в основном потоке тривиален.

И ни одна нить не блокируется во время delaySeconds перед запуском отправленного блока.

+0

Спасибо, rmaddy! Я ценю ваш подробный ответ! Так что, похоже, я могу двигаться вперед и продолжать развиваться именно так. – Brandon

+0

Думаю, я перепутал себя. Удалит мой комментарий. –