2013-07-03 2 views
0

함수 호출 루프가 있지만 내보기가 나타나면 호출하고보기가 사라지면 호출하지 말아야합니다.iOS에서 NSThread 중지

루프 기능 :

-(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]; 
     ... 
} 

그리고

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

ViewWillAppear()에서 그리고 DidDisAppear()

[timer invalidate]; 
timer = nil; 

에서하지만이 작동하지 않는, 그것은 여전히 ​​전화 내 응용 프로그램 충돌이 있습니다.

아무도 도와 줄 수 있습니까? 미리 감사는

+0

당신은 당신이 응용 프로그램이 충돌 할 때 수신하는 그것을 줄 오류 메시지를 추가 할 수 추락 했어? 또한'scheduledTimerWithTimeInterval ...'은 현재 스레드 ('viewWillAppear'에서 호출 된 것이므로 주 스레드)에서 타이머를 예약하고, 메인 스레드에서'[NSThread sleep ...]'을 호출해서는 안됩니다. –

+0

메서드에 매개 변수가 없기 때문에 전달하는 경우에도 타이머의 메서드 이름을 (updateArray)로 변경하면됩니다. –

답변

0

그것은 당신이 정말로 원하는 것은 콜백 FileSizeArrayFileCurrentSizeArray 변화를받을 Key-Value Observing를 사용하는 것을 나에게 소리. ViewDidAppear에서

:

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

콜백 :

- (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 호환 속성이 ​​아니라는 것이 확실합니다. –