2011-11-24 43 views
0

我有一個通過漫長操作(10-15秒加載時間)進行運算的類方法。向類方法發送通知

+(NSString*)shrinkKML 
{ 
    //lengthy operation 
} 

當從應用程序委託引發applicationDidEnterBackground時,發送通知以中斷它的最佳方式是什麼?我通常會對設置標誌的自定義類實施NSNotificationCenter調用,然後我的「冗長操作」可以定期檢查標誌。在這裏捕獲的是類方法(糾正我,如果我錯了)不能依賴於實例變量。有另一種方法嗎?

+0

這是一個可取消的操作嗎?我的意思是它是一個同步類方法,對嗎?它甚至檢查是否在任何時候都取消了嗎? – NJones

回答

0

這裏趕上是類方法(糾正我,如果我錯了)不能取決於實例變量。

您可以使標誌成爲一個全局變量。

類.m文件:

BOOL isCancelled; 

@implementation SomeClass 

+ (void)shrinkKML { 
    isCancelled = NO; 

    // Do stuff and check isCancelled 
} 

@end 

應用委託.m文件:

extern BOOL isCancelled; 

@implementation AppDelegate 

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    isCancelled = YES; 
} 

@end 

不過,如果我可以提一個建議,一個很好的方式來創建和管理長期運行異步任務正在使用NSOperation和NSOperationQueue。他們具有內置的取消功能。您可以創建啓動此任務的NSOperationQueue對象,然後將shrinkKML作爲NSOperation添加到隊列中。要將shrinkKML函數轉換爲NSOperation,您可以繼承NSOperation。實施可能需要一些工作,但比重新發明車輪要好。

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html

+0

感謝您的回答 - 爲我確認了一堆東西。我實際上有這種異步運行,但沒有意識到取消功能是內置的! – capikaw

0

我建議定期檢查使用[UIApplication sharedApplication].applicationState直接狀態。

+0

我從來沒有用過applicationState - 你能提供一個如何檢測背景狀態的代碼示例嗎? – capikaw