2012-06-07 4 views
0

정기적으로 서버에 폴링하는 앱이 있습니다. 폴링은 타이머 작업을 사용하여 수행됩니다. 타이머는 한 화면에서만 사용해야하므로 다른 화면으로 이동하면 타이머가 무효화됩니다.NSTimer - 여러 인스턴스가 생성되었습니다.

가끔 타이머가 무효화되는 경우가 있지만 때로는 그렇지 않은 것으로 나타났습니다. 무효화되지 않으면 여러 인스턴스가 계속 생성됩니다. 다음과 같이 내가 타이머를 초기화 한

:

timer = [NSTimer scheduledTimerWithTimeInterval: 2 
             target: self 
             selector: @selector(timerTask:) 
             userInfo: nil 
             repeats: YES]; 

다음과 같이 무효 :

if(timer){ 

    [timer invalidate]; 
    timer = nil; 


} 

이 도와주세요은 무엇을 필요로하는 것은이 경우에 할 수있다. 사전에

감사합니다.

답변

1

여러 개의 타이머를 만드십니까? 코드에서 타이머가 이미 정의되어있는 경우 당신은 당신이 실행할 때, 위의 게시 냈다 :

timer = [NSTimer scheduledTimerWithTimeInterval: 2 
            target: self 
            selector: @selector(timerTask:) 
            userInfo: nil 
            repeats: YES]; 

만에 원래 하나에 대한 참조를 얻을 수있는 유일한 방법을 만든 새로운 하나를 줄 것이다 타이머에 더 참조 선택기의 인수를 확인하고 정의한 타이머 인스턴스 변수와 다른지 확인하십시오.

+0

예, 사용자가 폴링을 수행해야하는 원래 화면으로 돌아올 때 타이머를 다시 초기화하고 있습니다. 문제는 주로 다음 화면 -> 타이머 중지 -> 화면 2 호출 -> 뒤로 버튼 클릭 ->보기가 수퍼 뷰에서 제거 된 경우 발생하며 여기에서 새 인스턴스가 만들어집니다. 나는 이것이 문제의 원인이라고 생각한다. 다시 타이머를 맞출 때 다시 시작해야합니다. – iOSDev

+0

어떻게 달성 할 수 있습니까? – iOSDev

0

NSTimer를 "다시 시작"할 수있는 방법이 없습니다. 타이머가 생성되고 화면 2가 호출 될 때 시간을 포함하여 날짜를 추적하는 두 가지 속성을 만들 수 있습니다. 화면 2로 이동하면 타이머를 무효화하고 화면 1로 돌아가서 두 날짜 개체 간의 시간차를 가져 와서 폴링 사이의 시간에서 빼고 해당 시간 간격으로 새 타이머를 만듭니다. 이것은 사용자에게 타이머의 "이력서"인 것처럼 보일 것입니다.

0

retainNSTimer 개체 여야한다고 생각합니다.

timer = [[NSTimer scheduledTimerWithTimeInterval: 2 
              target: self 
             selector: @selector(timerTask:) 
             userInfo: nil 
             repeats: YES] retain]; 

다음과 같이 당신은 아마, startingstopping 타이머 2 개 가지 방법을 만들어야합니다

if(timer){ 

    [timer invalidate]; 
    [timer release]; 
    timer = nil; 
} 
+0

내가 타이머를 풀면 앱이 깨지고있다. – iOSDev

1

무효로합니다.

-(void)startTimer { 

    if([timer isValid]) { 
     [timer invalidate]; 
     timer = nil; 
     } 

    timer = [NSTimer scheduledTimerWithTimeInterval: 2 
           target: self 
           selector: @selector(timerTask:) 
           userInfo: nil 
           repeats: YES]; 
} 

-(void)stopTimer { 

    if([timer isValid]) { 
     [timer invalidate]; 
     timer = nil; 
    } 
    } 

이는 타이머를 start 할 수 있고, 인스턴스가 이미 유효한 경우 그것을 무효화하고 새로운 하나를 시작합니다. 중지하면 해당 번호가 무효화되고 다음 번 startTimer 호출에서 timer을 초기화 할 준비가됩니다.

희망이 도움이됩니다.

+0

나는 이것을했다. 그러나 여전히 같은 문제 다. .. 도와주세요. 지금까지 붙어있어. – iOSDev