我正在做一个应用程序,它在读取XML文件时使用NSThread加载viewControllers的内容。
我完成了如下操作:
-(void)viewDidAppear:(BOOL)animated
{
// Some code...
[NSThread detachNewThreadSelector:@selector(loadXML) toTarget:self withObject:nil];
[super viewDidAppear:YES];
}
-(void)loadXML{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Read XML, create objects...
[pool release];
}
我的问题是,如果用户在加载NSThread时更改为另一个viewController,我不知道如何停止NSThread,这样应用就会崩溃。
我试图按如下方式取消或退出NSThread,但没有成功:
-(void)viewsDidDisappear:(BOOL)animated{
[NSThread cancel];
// or [NSThread exit];
[super viewDidDisappear:YES];
}
有人可以帮忙吗?感谢。
答案 0 :(得分:8)
当您分离新线程时,您无法再从viewDidDisappear等取消或退出它。这些特定于UI的方法仅在主线程上执行,因此退出/取消适用于主线程,这显然是错误的。
不使用分离新线程方法,而是在.h中声明NSThread变量并使用 initWithTarget: selector: object:
方法对其进行初始化,并随时随地取消它。
答案 1 :(得分:1)
您还可以使用[NSThread exit];
的{{1}}方法。
答案 2 :(得分:0)
如果可以,最好让线程优雅地结束,即达到其自然结论。这听起来像你的情况下,你可以负担得起。还要确保您正在从主线程而不是辅助线程更新用户界面,因为UIKit
不是线程安全的。
答案 3 :(得分:0)
标记用于取消或退出的线程后,您必须手动停止调用该线程的任何操作。一个例子: ....
- (void) doCalculation{
/* Do your calculation here */
}
- (void) calculationThreadEntry{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSUInteger counter = 0;
while ([[NSThread currentThread] isCancelled] == NO){
[self doCalculation];
counter++;
if (counter >= 1000){ break;
} }
[pool release]; }
application:(UIApplication *)application
- (BOOL)
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
/* Start the thread */
[NSThread detachNewThreadSelector:@selector(calculationThreadEntry)
toTarget:self withObject:nil];
// Override point for customization after application launch. [self.window makeKeyAndVisible];
return YES;
}
在此示例中,循环以线程处于未取消状态为条件。