这很糟糕,我确信我在这里缺少一些基本的东西。
我拥有的是
当我按下button1然后for循环开始时,会发生什么。我不能按下屏幕上的任何按钮,直到这个for-loop结束,即我不能按下按钮2。
我怎样才能这样做,当我按下按钮1时,我仍然能够通过按下按钮2来取消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];
});
}
答案 0 :(得分:2)
正如其他人所说,你必须使用另一个线程/进程来运行长时间运行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。
答案 1 :(得分:0)
您必须从单独的线程运行该长时间运行的操作才能打开主UI线程以进行用户交互。
然后,您可以通过按钮2的操作向您的其他线程发送取消消息。
答案 2 :(得分:0)
您可以启动一个新线程来执行for循环。