2011-09-13 42 views
4

我正在做一个应用程序,它在读取XML文件时使用NSThread加载viewControllers的内容。如何取消或停止NSThread?

我已经为它做了如下:

-(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

做你的 - (空)viewsDidDisappear:叫(BOOL)动画的方法? – Maulik

+0

是的,我忘了写 – karse23

回答

7

当你分离新的线程时,你不能再从viewDidDisappear中取消或退出它们。这些UI特定的方法只在主线程上执行,所以exit/cancel适用于显然是错误的主线程。

而不是使用分离新线程的方法,声明NSThread变量h和使用initWithTarget: selector: object:方法来初始化它,每当/无论你想取消的话..

+0

你是对的,它的工作原理非常感谢! – karse23

1

你也可以使用的NSThread[NSThread exit];方法。

+0

我已经试过这一点,但对我来说这没有工作,应用程序崩溃=( – karse23

+0

什么是你的崩溃日志? – Maulik

+0

使用[NSThread退出]不显示崩溃日志,只需将应用程序停止响应,而线程完成,如果我不使用线程停止或取消此日志:终止应用程序由于未捕获的异常“NSInvalidArgumentException”,原因:“ - [__ NSCFDictionary addSubview:]:无法识别的选择发送到实例... – karse23

0

这是更好地让一个线程结束优雅如果可以的话,即达到其自然结论。这听起来像你的情况,你可以负担得起。另外请确保您正在从主线程更新用户界面,而不是辅助线程,因为UIKit不是线程安全的。

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

在这个例子中,环被调节的螺纹处于非取消状态上。