我想在View disapear时停止调用循环函数。我怎样才能做到这一点?这是我的代码:
-(void) viewWillAppear:(BOOL)animated
{
[self performSelectorInBackground:@selector(updateArray) withObject:nil];
}
并且:
-(void)updateArray
{
while (1)
{
NSLog(@"IN LOOP");
[NSThread sleepForTimeInterval:2.0];
....}
当此视图消失时,通常会调用updateArray。我想停止调用updateArray函数
提前致谢
答案 0 :(得分:2)
制作BOOL
iVar或属性
BOOL loopShouldRun;
viewWillAppear中的将其设置为YES
。
然后使用此代码
-(void)updateArray
{
while (loopShouldRun)
{
NSLog(@"IN LOOP");
[NSThread sleepForTimeInterval:2.0];
....}
}
并在viewWillDisappear中将其设置为NO。
但正如@Michael Deuterman在评论中提到的,当sleepTimer激活之前视图消失时可能会出现问题。
所以继承人是NSTimer的另一个解决方案。
NSTimer
iVar / @属性:@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");
}
答案 1 :(得分:0)
while (1)
{
NSLog(@"IN LOOP");
[NSThread sleepForTimeInterval:2.0];
}
而(1)永远是真的。要停止它,你需要有一个阻止循环发生的条件。
例如,
while (1)
{
NSLog(@"IN LOOP");
[NSThread sleepForTimeInterval:2.0];
if(something happens)
break;
}
希望它对你有所帮助。
答案 2 :(得分:0)
这是一个简单的逻辑...只需取一个标志变量并在viewdisapper然后
更新该标志varibale的值 - (void)viewWillDisappear:(BOOL)animated
上面的方法方法将在视图消失之前调用
viewDidDisappear:(BOOL)animated
以上方法也在那里。在您的视图消失后立即调用
所以你可以在上面的方法之一中改变你的标志变量的值。然后根据你的标志变量值,只需将break
放入你的while循环中,你的循环就会破坏
答案 3 :(得分:0)
使用NSThread
代替performSelector
NSThread *myThread; // preferable to declare in class category in .m file or in .h file
在 viewWillAppear
中myThread = [[NSThread alloc] initWithTarget:self selector:@selector(updateArray) object:nil];
[myThread start];
在 viewWillDisappear
中[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 Class Reference