2013-06-27 4 views
1

일정한 시간 내에 파일 내용을 자동으로 저장하는 루틴 (예 : 저장 지침을 수행하는 백 그 루프)을 만들어야합니다. 나는 아래와 같이 사용 performSelector의 재귀 호출을 thinked :objective-c에서 백그라운드 루프 루틴을 만드는 더 좋은 방법은 무엇입니까?

- (void)viewWillAppear:(BOOL)animated{ 

    [super viewWillAppear:animated]; 

    [self performSelector:@selector(saveMethod) withObject:nil afterDelay:kTimeConstant]; 

} 

- (void)saveMethod{ 

    //The save logic should to be here 

    [self performSelector:@selector(saveMethod) withObject:nil afterDelay:kTimeConstant]; 

} 

의미가 있습니다,하지만 난의 ViewController에서 얻을 때, 그것은 여전히 ​​실행, 그리고 그것을 중지하려면해야합니다. 더 좋은 방법이 있습니까? 고맙습니다!

+1

게시 한 코드는 백그라운드에서 (즉, 별도의 스레드에서) 아무 것도하지 않습니다. 실제로 비 저장 스레드에서 저장이 수행되기를 원하십니까? –

+1

실행을 원하지 않으면'viewWillDissapear :'메소드에서 @selector 메소드를 취소 할 수 있습니다. 그리고 이것은 배경 방법이 아닙니다. 지연 후 메인 스레드를 호출합니다. – TheTiger

+0

나는 RichtextEditor가 있고 시간을 자동 저장하는 html 내용을 저장하고 싶지만 사용자에게 보이지 않도록 실행을 잠글 수는 없다. 그래서 실행을해야한다고 생각한다. 메인 스레드. –

답변

2

이 아마 더 나은 구현 : 그것은 아마 최선의 구현이 아니라 당신이 현재 가지고있는 것보다 더 잘 작동한다, 그래서 이것은 주 스레드에서 실행

- (void)viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 

    // Start timer and sets it to a property called saveTimer 
    self.saveTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 
           target:self 
          selector:@selector(saveMethod:) 
          userInfo:nil 
          repeats:YES]; 
} 

- (void)saveMethod:(NSTimer*)theTimer { 
    // The save logic should to be here 
    // No recursion 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    // Stop timer 
    [self.saveTimer invalidate]; 
} 

.

+0

그것은 나를 위해 재미있어 보입니다. 고마워요 Firo! –

+0

더 나은 구현을 말하지 않습니다. – TheTiger

+0

정말 잘 작동하지만 invalidade는 타이머를 멈추지 않습니다. = ( –

2

performSelector 호출을 취소 할 수있는 NSRunLoop cancelPreviousPerformRequestsWithTarget:selector:object: 함수가 있습니다. 보기 컨트롤러를 언로드 할 때 이것을 호출하십시오.

예.

[NSRunLoop cancelPreviousPerformRequestsWithTarget:self selector:@selector(saveMethod) object:nil];