2013-06-27 24 views
1

我需要創建一個例程自動保存文件內容在一定時間,即執行保存指令的backgroung循環。我在使用鑫卡特performSelector的遞歸調用象下面這樣:如何在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內容,但它不'噸可以鎖定的執行,是用戶看不到的,所以我認爲它should't運行主線程。 –

回答

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

有一個功能NSRunLoop cancelPreviousPerformRequestsWithTarget:selector:object:,它允許您取消performSelector電話。當你卸載視圖控制器

即調用此。

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