0

我想在 View 消失时停止调用循环函数。我怎样才能做到这一点?这是我的代码:

    -(void) viewWillAppear:(BOOL)animated
{
    [self performSelectorInBackground:@selector(updateArray)  withObject:nil];

}

和 :

    -(void)updateArray
{

while (1)
{
    NSLog(@"IN LOOP");
   [NSThread sleepForTimeInterval:2.0];
....}

updateArray 通常在此视图消失时调用。我想停止调用 updateArray 函数

提前致谢

4

4 回答 4

2

制作BOOLiVar 或属性

BOOL loopShouldRun;

在 viewWillAppear 中将其设置为YES.

然后使用此代码

-(void)updateArray
{
  while (loopShouldRun)
    {
      NSLog(@"IN LOOP");
      [NSThread sleepForTimeInterval:2.0];
....}
}

并在 viewWillDisappear 中将其设置为 NO。

但是正如@Michael Deuterman 在评论中提到的那样,当视图在 sleepTimer 触发之前消失时可能会出现问题。

所以这是另一个使用 NSTimer 的解决方案。

  • 创建一个NSTimeriVar/@property: @property (strong) NSTimer *timer;
  • viewWillAppear创建计时器:

    timer = [NSTimer timerWithTimeInterval:2.0 invocation:@selector(updateArray) repeats:Yes]

  • 使viewWillDiappear计时器无效:

    if ([self.timer isValid]) { [self.timer invalidate] }

updateArray现在应该是这样的:

-(void)updateArray {
  NSLog(@"in loop");
}
于 2013-07-03T07:14:40.733 回答
0
while (1)
{
    NSLog(@"IN LOOP");
   [NSThread sleepForTimeInterval:2.0];
}

while(1) 将永远为真。要停止它,您需要有一个条件来阻止循环发生。

例如,

while (1)
{
    NSLog(@"IN LOOP");
   [NSThread sleepForTimeInterval:2.0];
   if(something happens)
    break;
}

希望它可以帮助你。

于 2013-07-03T07:15:24.583 回答
0

这是一个简单的逻辑...只需取一个标志变量并在您的视图消失时更新该标志变量的值

 - (void)viewWillDisappear:(BOOL)animated 

上述方法方法将在视图消失之前调用

viewDidDisappear:(BOOL)animated

上面的方法也有。将在您的视图消失后立即调用

因此您可以在上述方法之一中更改标志变量的值。然后根据您的标志变量值将其放入 break您的 while 循环中,您的循环将中断。

于 2013-07-03T07:15:37.560 回答
0

使用NSThread代替performSelector

NSThread *myThread; // preferable to declare in class category in .m file or in .h file

视图中会出现

myThread = [[NSThread alloc] initWithTarget:self selector:@selector(updateArray) object:nil];
[myThread start];

视图中将消失

[myThread cancel]; // This will stop the thread and method will get stopped from execution
myThread = nil; // Release and nil object as we are re-initializing in viewWillAppear

有关更多详细信息,请参阅:NSThread 类参考

于 2013-07-03T07:24:45.727 回答