<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi!<div class=""><br class=""></div><div class="">I have a somewhat unusual use-case that I’m trying to figure out.</div><div class=""><br class=""></div><div class="">I have a command-line swift app whose main thread ends up in an infinite loop for graphics rendering purposes (running SDL).</div><div class=""><br class=""></div><div class="">What I’m hoping to do is to be able to run async code like this from within that infinite loop:</div><div class=""><br class=""></div><div class=""><i class="">DispatchQueue.someQueue.async {</i></div><div class=""><i class=""><span class="Apple-tab-span" style="white-space:pre">        </span>// do something</i></div><div class=""><i class=""><span class="Apple-tab-span" style="white-space:pre">        </span>DispatchQueue.main.async {</i></div><div class=""><i class=""><span class="Apple-tab-span" style="white-space:pre">                </span>// return result</i></div><div class=""><i class=""><span class="Apple-tab-span" style="white-space:pre">        </span>}</i></div><div class=""><i class="">}</i></div><div class=""><br class=""></div><div class="">The issue is that the <i class="">DispatchQueue.main.async</i> block never runs, which is pretty logical given that it’s called&nbsp;<i class="">inside&nbsp;</i>the infinite loop - so where would it possibly get to run?</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">The question is, how do we achieve this? Is there a better way to have an infinite loop on the main thread (e.g. Foundation’s RunLoop class etc)? On iOS (where I have the most experience with Swift), the rendering loop’s implementation is obviously hidden.</div><div class=""><br class=""></div><div class="">Theoretically we could probably do the entire rendering loop like this:</div><div class=""><br class=""></div><div class=""><i class="">func renderStuff() {</i></div><div class=""><i class=""><br class=""></i></div><div class=""><span class="Apple-tab-span" style="font-style: italic; white-space: pre;">        </span><i class="">//&nbsp;actually&nbsp;render stuff</i></div><div class=""><i class=""><br class=""></i></div><div class=""><i class=""><span class="Apple-tab-span" style="white-space:pre">        </span>if !shouldQuit {</i></div><div class=""><i class=""><span class="Apple-tab-span" style="white-space:pre">                </span>DispatchQueue.main.async(renderStuff) // loops here</i></div><div class=""><i class=""><span class="Apple-tab-span" style="white-space:pre">        </span>}</i></div><div class=""><i class="">}</i></div><div class=""><i class=""><br class=""></i></div><div class=""><i class="">// Start render loop:</i></div><div class=""><i class="">DispatchQueue.main.async(renderStuff)</i></div><div class=""><br class=""></div><div class="">But I am pretty sure the DispatchQueue API is not intended to be used like that :)</div><div class=""><br class=""></div><div class="">Any ideas? Maybe an API that basically says “dequeue and perform work from the DispatchQueue”?</div><div class=""><br class=""></div><div class="">Cheers,</div><div class="">Geordie</div><div class=""><br class=""></div></body></html>