当应用程序退出时停止执行进程

时间:2013-11-15 19:04:28

标签: ios multithreading exit

我有一个应用程序,用户可以启动刷新,我想正确构建东西来处理应用程序退出,电话,主页按钮等等。如果用户点击中间的主页按钮现在,当他们重新打开应用程序时,它会继续运行。我不确定我是否想要这个。我希望主页按钮能够杀死那个进程并让他们在重新打开时重新开始。什么是最好的方法来阻止你正在做的事情(我明白我需要使用didenterbackground和反向)。这个过程应该在后台线程上,所以我可以NSThread取消?我读过有关定期检查标志的信息,但是一旦检测到这种情况,我该如何停止?这让我很好奇,我确信这很简单,但最好的方法就是停止执行某些事情。

2 个答案:

答案 0 :(得分:1)

来自Apple的Thread Programming Guide(线程管理 - >终止线程):

  

尽管Cocoa,POSIX和Multiprocessing Services提供了直接杀死线程的例程,但强烈建议不要使用此类例程。杀死一个线程可以防止该线程自行清理。 线程分配的内存可能会被泄露,并且线程当前正在使用的任何其他资源可能无法正确清理,以后会产生潜在问题

     

如果您预计需要在操作过程中终止线程,则应该从一开始就设计线程以响应取消或退出消息。对于长时间运行的操作,这可能意味着定期停止工作并检查是否有这样的消息到达。如果确实有消息要求线程退出,则线程将有机会执行任何所需的清理并正常退出;否则,它可以简单地返回工作并处理下一个数据块。

它还有示例代码如何执行此操作:

- (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];
    }
}

答案 1 :(得分:0)

创建NSOperationQueue。对于所有长时间运行的任务,请创建NSOperation个对象,将它们放在NSOperationQueue上。您可以使用应用委托的applicationWillResignActive方法或UIApplicationWillResignActiveNotification通知来检测应用何时进入后台。

当您检测到状态转换时,只需调用队列的cancelAllOperations方法即可。如果您只是暂停它,队列中还有一个suspended属性。 (你可以稍后再恢复。)

NSOperationQueue是一项出色的技术。比GCD高得多。学习它,喜欢它!