如果 for 循环正在运行,则无法按下 UIButton

Posted

技术标签:

【中文标题】如果 for 循环正在运行,则无法按下 UIButton【英文标题】:cannot press UIButton if for loop is running 【发布时间】:2013-09-13 14:14:43 【问题描述】:

这很奇怪,我敢肯定我在这里遗漏了一些基本的东西。

我拥有的是

两个 UIButton:button1、button2 Touchdown button1 有一个名为 startAction 的 IBAction Touchdown button2 有一个名为 cancelAction 的 IBAction 在故事板中创建了所有这些

发生的情况是,当我按下 button1 时,for 循环开始。在此 for 循环结束之前,我无法再按屏幕上的任何按钮,即我无法按下按钮 2。

我怎样才能做到这一点,当我按下 button1 时,我仍然可以通过按下 button2 来取消 button1 的 for 循环动作。这是我的代码

static bool scanCancelled = NO;

-(IBAction)startAction

    for (int i=0; i<5000; i++)
      
        NSLog(@"i: %d ...", i);

        if (scanCancelled == YES)
        
            break;
        
    //end for-loop
 

-(IBAction)cancelAction

    scanCancelled = YES;

对于任何对未来感兴趣的人,我就是这样做的

-(IBAction)startAction2

    //reset it
    scanCancelled = NO;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                             (unsigned long)NULL), ^(void) 
        [self startAction];

    );


【问题讨论】:

这一切都在主线程上运行。您的循环在执行时阻塞了线程。 你的for 循环阻塞了主线程,阻止了任何事件的发生。 【参考方案1】:

正如其他人所说,您必须使用另一个线程/进程来运行长时间运行的 for 循环,以便 UI 可以继续处理事件等。

但我不建议在 ios 中使用线程类,除非你习惯了多线程*,否则它看起来有点迟钝,我建议使用 Grand Central Dispatch:https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

使用它非常简单,并且会向您介绍非常强大的块。这是一个帮助您入门的教程:http://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial

*话虽如此,您应该研究典型的线程模型及其工作原理。这些概念的使用远远超出了 iOS 和 Objective-C。

【讨论】:

【参考方案2】:

您必须从单独的线程运行该长时间运行的操作才能打开主 UI 线程以进行用户交互。

然后您可以通过按钮 2 的操作向您的其他线程发送取消消息。

【讨论】:

【参考方案3】:

你可以启动一个新线程来执行for循环。

【讨论】:

以上是关于如果 for 循环正在运行,则无法按下 UIButton的主要内容,如果未能解决你的问题,请参考以下文章

运行while循环,直到收到特定输入,但如果没有收到c ++则重新运行

安装时应用程序无法正常运行

for 循环

如何在python中运行其他代码时在后台运行循环

如何检查文件是否不存在,并使用For循环显示一个整体响应

15PHP 循环 - For 循环