2013-07-03 2 views
0

У меня есть цикл вызова функции, но я хочу называть его, если появляется мой вид, и не вызывать его, когда вид исчезает.Остановить NSThread на iOS

Функция Loop:

-(void)updateArray 
    { 

    while (1) 
    { 
     NSLog(@"IN LOOP"); 
     [NSThread sleepForTimeInterval:2.0]; 
     if([FileSizeArray count] >0 || [FileCurrentSizeArray count] >0) 
     { 
      [FileSizeArray removeObjectsInRange:NSMakeRange(1, FileSizeArray.count-1)]; 
      [FileCurrentSizeArray removeObjectsInRange:NSMakeRange(1, FileSizeArray.count-1)]; 
     } 
     [FileNameArray removeAllObjects]; 
     [UserNameArray removeAllObjects]; 
     ... 
} 

И ViewWillAppear()

timer= [NSTimer scheduledTimerWithTimeInterval: 2.0 
               target: self 
               selector:@selector(updateArray:) 
               userInfo: nil repeats:NO]; 

И DidDisAppear()

[timer invalidate]; 
timer = nil; 

Но это не работает, она до сих пор называют и мое приложение имеет сбой.

Может ли кто-нибудь мне помочь? Заранее спасибо

+0

Вы можете добавить сообщение об ошибке вы получили, когда приложение разбился, и на какой строке его разбился? Кроме того, 'scheduleTimerWithTimeInterval ... 'расписывает таймер на текущем потоке (который является основным, поскольку он вызывается из' viewWillAppear'), и вы не должны вызывать '[NSThread sleep ...]' в основном потоке. –

+0

, потому что у вашего метода нет параметров и, хотя вы его передаете, просто измените имя метода по таймеру (updateArray), все будет хорошо. –

ответ

0

Мне кажется, что вы действительно хотите сделать, это использовать Key-Value Observing, чтобы получить обратный вызов, когда FileSizeArray и FileCurrentSizeArray изменить.

В ViewDidAppear:

[self addObserver:self forKeyPath:@"FileSizeArray.count" options: 0 context: nil]; 
[self addObserver:self forKeyPath:@"FileCurrentSizeArray.count" options: 0 context: nil]; 

Callback:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 

    if ([keyPath isEqualToString:@"FileSizeArray.count"]) { 
     //do something 
    } else if ([keyPath isEqualToString:@"FileCurrentSizeArray.count"]) { 
     //do something 
    } 

} 

забудьте разрегистрировать:

[self removeObserver:self forKeyPath:@"FileSizeArray"]; 
[self removeObserver:self forKeyPath:@"FileCurrentSizeArray"]; 
+0

Спасибо, но это не работает, я хочу остановить NSThread, когда вид исчезнет. –

+0

Я уверен, что 'count' не является свойством KVO. –

Смежные вопросы