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