【问题标题】:Wait for Mouse Click Inside While Loop等待鼠标在 While 循环内单击
【发布时间】:2016-03-22 19:40:04
【问题描述】:

我正在为一个 OS X 项目使用 Sprite Kit,但我不知道如何在单击鼠标之前暂停我的 while 循环。我想要的是这样的:

while (i < 50){
    print(i)
    i += 1
    waitForMouseClick()
}

【问题讨论】:

  • 这将阻塞主线程,您的应用程序将无法接收鼠标点击。
  • 那么您对实现这种行为有什么建议吗?
  • 您正在寻找的行为有点复杂。您需要做的是保持应用程序的主事件循环运行,以便将鼠标事件发送到您的程序,同时跟踪循环的上下文。总的来说,您似乎需要花一些时间来学习更多有关操作系统事件处理的知识。那或者你需要在你的问题中提供一个更大的背景来说明你想要达到什么效果。
  • 我想要达到的效果和问题完全一样。我有一个非常基本的 while 循环,我正在使用它来操作数组。每转一圈后,我都会在屏幕上显示数组数据,之后我想等待用户输入继续下一步。

标签: swift macos sprite-kit


【解决方案1】:

我使用 GCD 后台队列和信号量解决了这个问题。可能对阅读本文的其他人有所帮助。

// CREATE A BACKGROUND QUEUE AND SEMAPHORE
let bgQueue = dispatch_queue_create("myQueue", nil)
let semaphore = dispatch_semaphore_create(0) 

override func didMoveToView(view: SKView) {
    //DISPATCH CODE BLOCK TO QUEUE
    dispatch_async(bgQueue, {
        //THIS WILL GRAB YOUR SEMAPHORE
        dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_NOW)
        var i: Int = 0
        while (i<50){
            i += 1
            //BLOCK
            dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER)
            print(i)
        }
    })
}

override func mouseDown(theEvent: NSEvent) {
    //RELEASE SEMAPHORE
    dispatch_semaphore_signal(semaphore)
}

【讨论】:

  • 您愿意解释一下您正在实施哪个类吗?否则我不明白 mouseDown 会覆盖什么?
猜你喜欢
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 2012-10-13
  • 2012-05-20
  • 1970-01-01
相关资源
最近更新 更多