2

我的应用程序中有一个主线程和一个辅助线程。众所周知,UI 正在使用主线程。我使用辅助线程来后台加载我的视图。我有一个主控制器,我称之为虚拟控制器。从那里我打电话给我的主控制器,它处于横向模式。

所以基本上我要做的是,当我旋转我的虚拟控制器时,我希望能够加载我的主景观控制器,反之亦然。

当我从虚拟旋转到主要时,一切正常。主控制器有一系列要加载的子控制器,所以我将该进程放在辅助线程上,到那时它们正在加载,我会显示一个加载器屏幕。

dummy 是一个普通的视图控制器,而 main 是一个模态视图控制器。

现在的问题。

如果用户试图旋转表单 dummy --> main,rotate 方法会启动主视图控制器的初始化。但是由于某种原因,用户改变了主意并从 main-->dummy 旋转回来,理想情况下,过渡应该是平滑的,因为 UI 线程(main theread)是免费的。会发生什么是 UI 旋转回来。但是由于主控制器上的辅助线程仍然处于开启状态,即使在主线程在 MainController 上调用了dismiss modal控制器之后,当我们调用 willRotate 函数时。

我在各种帖子中读到我们不能简单地杀死辅助线程,因为我们必须自己清理东西。那么任何人都可以指导我完成代码,我如何杀死我的辅助线程并在我转回我的调用表单之前进行清理..??它有点紧急......请不要指向其他线程主题,因为我已经访问过那些。

我特别想知道我应该如何停止我的辅助线程,而不会导致崩溃。谢谢。

-(void)viewDidLoad {

[super viewDidLoad];

workingThread = [[NSThread alloc]initWithTarget:self selector:@selector(parseMainTextFile) object:nil];

[workingThread start];

[NSThread detachNewThreadSelector:@selector(addLoader) toTarget:self withObject:nil];
    //[self performSelectorOnMainThread:@selector(parseMainMatchTextFile) withObject:nil waitUntilDone:NO];

}
4

1 回答 1

2

一般来说,如果你运行一个后台线程,这意味着你有一个运行循环,它在一个while语句中工作。您应该有一个停止运行循环的标志。这样它会将线程的状态转换为已完成。

while (mRunLoop && [mLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

我就是这样做的。另外从评论中阅读这篇文章及其子帖子。祝你好运!

于 2010-12-29T16:09:56.240 回答