你能快速运行函数多次吗?

Posted

技术标签:

【中文标题】你能快速运行函数多次吗?【英文标题】:can you run functions multiple times swift? 【发布时间】:2021-04-02 03:28:21 【问题描述】:

我正在 Swift Playgrounds 中开发一款游戏,我试图让一个函数在变量发生变化时运行多次。这是我下面的代码

    public override func mouseDown(with event1: NSEvent) 
        NP = self.childNode(withName: "NP") as? SKLabelNode
        txt = self.childNode(withName: "Talking") as? SKLabelNode

        let point1 = event1.location(in: self)
        let hitnodes1 = self.nodes(at: point1)

        var counter = 0

        if hitnodes1.contains(where: $0.name == "NP") 
            if (counter == 0) 
                txt.text = "Test2"

                DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) counter += 1
                //wait here so that it doest automatically go to the next one
            
            if (counter == 1) 
                    txt.text = "Test3"

                counter += 1
                

                
        
    

我认为问题出在我的计数器上,但也可能出在函数本身上。有没有人知道如何解决这个问题?任何帮助都会很棒:)

【问题讨论】:

你试图多次调用什么函数。我假设它应该由 counter 控制,您希望通过 asyncAfter 闭包对其进行更新。但我没有看到任何会调用函数的东西。您是否尝试模拟鼠标点击第二次? @ChipJarred 是的,我正在尝试模拟鼠标第二次点击。除了我这样做的方式之外,还有其他方法吗? 有多种方法可以做到。我将发布一个可能的答案。 你的问题让我想到了更多的方法。您可以使用NSApp.sendEvent 重新发送事件,以通过正常机制重新发送事件。在这种情况下,您需要一种方法来保持计数器处于活动状态。您可以将其设为视图的属性,也可以使用NSEventuserData 属性,但它是UnsafeRawMutablePointer,因此您将负责分配和释放它。 【参考方案1】:

如果了解您想要做什么(我完全有可能不这样做),我认为按照以下思路可以做到:

    public override func mouseDown(with event1: NSEvent) 
        mouseDown(with: event1, counter: 0)
    
    
    private func mouseDown(with event: NSEvent, counter: Int)
    
        NP = self.childNode(withName: "NP") as? SKLabelNode
        txt = self.childNode(withName: "Talking") as? SKLabelNode

        let point1 = event1.location(in: self)
        let hitnodes1 = self.nodes(at: point1)

        if hitnodes1.contains(where: $0.name == "NP")
        
            switch counter
            
                case 0:
                    txt.text = "Test2"
                    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) 
                        self.mouseDown(with: event, counter: counter + 1)
                    
                    //wait here so that it doest automatically go to the next one

                case 1:
                    txt.text = "Test3"
                    // This will actually generate a 3rd mouse click
                    mouseDown(with: event, counter: counter + 1)

                default: break
            
        
    

正如 David Wheeler 所说,“您可以通过添加间接层来解决任何问题。”在这种情况下,通过让实际的 AppKit mouseDown 调用一个带有计数器参数的私有应用程序,您可以直接从 DispatchQueue.asyncAfter 调用带有计数器的应用程序

【讨论】:

天哪,非常感谢!这很棒:) 我很高兴它有帮助

以上是关于你能快速运行函数多次吗?的主要内容,如果未能解决你的问题,请参考以下文章

在宏中过度使用会损害性能吗?

你能告诉我PHP中的这个谷歌驱动API调用函数有啥问题吗

你能在不同的线程上调用相同的方法吗?

你能用 BatchNormalization 解释神经网络中的 Keras get_weights() 函数吗?

你能在同一个提交的一个函数中有两个ajax调用吗?

你能告诉 php 服务器中止以前运行的脚本的执行吗?