Как переписать [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 какими-либо блоками!

1 ответ

Решение

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

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

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

Другие вопросы по тегам