2

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

我所拥有的是

  • 两个 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];

    });

}
4

3 回答 3

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。

于 2013-09-13T14:30:06.047 回答
0

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

于 2013-09-13T14:19:43.073 回答
0

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

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

于 2013-09-13T14:18:10.827 回答