[swift-users] Waiting for mouse input in a while loop (OS X)

Ergin Bilgin erginbil at gmail.com
Wed Mar 23 14:42:34 CDT 2016


Thank you. I knew it should be possible with GCD, but I was just not
familiar with semaphores. Now everything perfectly works in the way I want.


Ergin

On 23 March 2016 at 20:11, Jean-Denis Muys <jdmuys at gmail.com> wrote:

> Here is an outline on how you might achieve that.
>
> 1- Create a background GCD queue and a GCD semaphore.
> 2- dispatch_async your sort routine on that queue
> 3- add a call to dispatch_semaphore_wait before starting your sort. This
> will grab the semaphore.
> 4- at the //wait here point, call dispatch_semaphore_wait on your
> semaphore. Since the semaphore was already grabbed, this will block.
> 5- separately implement some button on your interface, and on the main
> thread, its action will be to call dispatch_semaphore_signal. This will
> release the semaphore, and make your sort continue
>
> I haven’t tested it, and there may be some devil in the details, but I
> think this can work.
>
> Jean-Denis
>
>
>
> On 23 Mar 2016, at 18:48, Ergin Bilgin via swift-users <
> swift-users at swift.org> wrote:
>
> Thank you for help. Maybe I have over simplified my problem. In my first
> example, your advice was totally fine. But when I want to do something more
> complex, I could not figure out how to use it. For example, I want to print
> each step in my insertion sort. Like this:
>
> for i in 1..<toSort.count{
>     var j: Int = i
>     while ((j > 0) && (toSort[j-1] > toSort[j])){
>         let temp: Int = toSort[j]
>         toSort[j] = toSort[j-1]
>         toSort[j-1] = temp
>         j--
>         print(toSort)
>         //Wait here.
>     }
> }
>
> I am looking for a solution without tearing the sorting algorithm into
> pieces. (If it is possible.)
>
> Ergin
>
> On 23 March 2016 at 18:52, George King <gwk.lists at gmail.com> wrote:
>
>> Hi Ergin,
>> Are you familiar with how events are delivered via the application
>> runloop? Essentially, you should not create a top-level loop that waits for
>> input; the application runloop does this for you. If you want to accumulate
>> 50 clicks, create the counter variable in the appropriate NSResponder (or
>> UIResponder on iOS), e.g. your root NSView or your NSViewController. Then
>> override `func mouseDown(event: NSEvent)` and increment the counter there.
>> Hope that helps,
>> George
>>
>>
>> >
>> > On Mar 23, 2016, at 12:35 PM, Ergin Bilgin via swift-users <
>> swift-users at swift.org> wrote:
>> >
>> > Hello,
>> >
>> > I have a very simple while loop and I want to wait for a mouse
>> click(can be a different input, not important) between every step.  What I
>> want to achieve is something like this:
>> >
>> > while (i < 50){
>> >
>> >
>> > print(i)
>> >
>> >     i
>> > += 1
>> >
>> >     waitForMouseClick
>> > () //Wait here for user input.
>> > }
>> > I also use Sprite Kit if you can think a solution related to it.
>> >
>> > Cheers,
>> >
>> > Ergin
>> >
>> > _______________________________________________
>> > swift-users mailing list
>> > swift-users at swift.org
>> > https://lists.swift.org/mailman/listinfo/swift-users
>>
>>
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160323/ac519b25/attachment.html>


More information about the swift-users mailing list