如果 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的主要内容,如果未能解决你的问题,请参考以下文章