Как переписать [NSRunLoop runUntilDate:] в код GCD?

Просто для моего любопытства я пытаюсь переписать следующий код

// show HUD (with animation)
[SVProgressHUD showWithStatus:@"loading..."];

// wait for HUD to safely finish showing its animation
// (loading HUD will be visible for 1 sec)
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]]

// dismiss HUD
// (dismiss HUD will be visible for 2 sec)
[SVProgressHUD dismissWithSuccess:@"finished!" afterDelay:2];

в код с помощью Grand Central Dispatch.

Я пробовал использовать dispatch_source_t, dispatch_semaphore_t и dispatch_after, но работает не очень хорошо :( и мне нужна ваша помощь!

Обратите внимание, что я не хочу оборачивать методы SVProgressHUD какими-либо блоками!


person inamiy    schedule 09.02.2012    source источник


Ответы (1)


Вы действительно не можете. Или вы могли бы, но это была бы тонна работы, которая в конечном итоге просто обертывала бы сам материал NSRunLoop.

В контексте iOS и Mac OS X основной цикл событий — это цикл выполнения, и такие вещи, как модальные панели, HUD и тому подобное, разработаны вокруг этой детали.

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

person bbum    schedule 09.02.2012
comment
Вы имеете в виду, что main-runloop вложен в тот же main-runloop??? Похоже, мне нужно больше изучить сам механизм цикла выполнения... - person inamiy; 09.02.2012
comment
Ага. Это именно то, что я имею в виду! Это все описано (с картинками) в документах. - person bbum; 09.02.2012