2013-11-15 108 views
0

我有一個應用程序,用戶可以在其中啓動刷新,並且我想要正確構建事情以處理應用程序退出,電話,主頁按鈕等事件。如果用戶點擊現在在進程中間的主頁按鈕,當他們重新打開應用程序時,它繼續前進。我不確定我想要這個。我希望home按鈕殺死這個進程,讓他們在重新打開時重新開始。什麼是最好的方式來阻止你在做什麼這樣說(我明白我需要使用didenterbackground和反向)。這個過程應該在後臺線程,所以我可以NSThread取消?我已經閱讀了關於定期檢查一個標誌的信息,但是一旦檢測到狀況,我該如何停止?它讓我很好奇,而且我確信它很簡單,但最好的辦法是簡單地停止執行某些東西。當應用程序退出時停止執行進程

回答

1

從蘋果公司的Thread Programming Guide(線程管理 - >終止線程):

雖然可可,POSIX,和多服務提供了直接殺死線程的例程,使用這些例程的強烈反對。殺死一個線程可以防止線程自行清理。 線程分配的內存可能會泄漏,線程當前正在使用的任何其他資源可能無法正確清理,從而在以後產生潛在問題

如果您預計需要在操作過程中終止線程,則應該從一開始就設計線程以響應取消或退出消息。對於長時間運行的操作,這可能意味着要定期停止工作並檢查是否收到了這樣的消息。如果消息確實要求線程退出,線程將有機會執行任何需要的清理並正常退出;否則,它可能會重新開始工作並處理下一塊數據。

,它也有示例代碼如何做到這一點:

- (void)threadMainRoutine 
{ 
    BOOL moreWorkToDo = YES; 
    BOOL exitNow = NO; 
    NSRunLoop* runLoop = [NSRunLoop currentRunLoop]; 

    // Add the exitNow BOOL to the thread dictionary. 
    NSMutableDictionary* threadDict = [[NSThread currentThread] threadDictionary]; 
    [threadDict setValue:[NSNumber numberWithBool:exitNow] forKey:@"ThreadShouldExitNow"]; 

    // Install an input source. 
    [self myInstallCustomInputSource]; 

    while (moreWorkToDo && !exitNow) 
    { 
     // Do one chunk of a larger body of work here. 
     // Change the value of the moreWorkToDo Boolean when done. 

     // Run the run loop but timeout immediately if the input source isn't waiting to fire. 
     [runLoop runUntilDate:[NSDate date]]; 

     // Check to see if an input source handler changed the exitNow value. 
     exitNow = [[threadDict valueForKey:@"ThreadShouldExitNow"] boolValue]; 
    } 
} 
+0

非常感謝回覆。我曾在其他地方看過這篇文章,但它讓我感到困惑,我想知道我是否不能做類似的事情。它肯定好像我應該避免取消線程並使用bool標誌定期檢查機制,但是如果我有一個檢查,並且我確定該操作需要停止,返回會停止一些事情,但是這會如何影響線程本身?作爲一個普遍的問題,如果沒有任何東西在運行,或者它到達代碼的最後,線程是否會關閉? – skinsfan00atg

0

創建NSOperationQueue。對於所有長時間運行的任務,請創建NSOperation對象,將它們放在NSOperationQueue上。您可以使用應用代理的applicationWillResignActive方法或UIApplicationWillResignActiveNotification通知來檢測應用何時進入後臺。

當您檢測到狀態轉換時,只需調用您的隊列的cancelAllOperations方法即可。如果您希望暫停它,那麼隊列上還有一個suspended屬性。 (你可以稍後恢復。)

NSOperationQueue是絕妙的技術。比GCD高得多。學習它,愛它!