即使使用nsthread接口冻结

时间:2010-12-13 15:48:41

标签: ios objective-c iphone nstimer nsthread

我必须使用NSThread执行计时器,因为我需要从网上下载文本数据,没有它,在3G连接中它会在下载时冻结UI。所以我使用了NSThread,但它仍然会冻结一段时间,我不知道如何解决这个问题....

这是我用来执行计时器的代码:

- (void)viewDidLoad{
  [NSThread detachNewThreadSelector:@selector(onTimerK2) toTarget:self withObject:nil];
}

- (void)onTimerK2{
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 timer = [NSTimer scheduledTimerWithTimeInterval:15 target:self selector:@selector(onTimerKY2) userInfo:nil repeats:YES];
 [pool release];
}

- (void)onTimerKY2{
    NSLog(@"working");
}

2 个答案:

答案 0 :(得分:1)

你正在分离一个新的线程来调用onTimerK2,然后立即在主线程上调用一个方法,这当然会冻结你的界面。

修改

你应该在主线程上做任何长时间运行的工作(或者你自己,或者使用其他地方提到的NSURLConnection的异步性质),然后通过调用主线程上的选择器来更新你的UI随着这项活动的进展。

话虽如此,您可以通过以下更改/重新排序代码获得更多成功:

- (void)viewDidLoad {
    timer = [NSTimer scheduledTimerWithTimeInterval:15 
                                             target:self 
                                           selector:@selector(onTimerK2) 
                                           userInfo:nil 
                                            repeats:YES];
}

- (void)onTimerK2{
    [NSThread detachNewThreadSelector:@selector(onTimerKY2) 
                             toTarget:self 
                           withObject:nil];
}

- (void)onTimerKY2{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSLog(@"working");
    [pool release];
}

答案 1 :(得分:0)

目前还不是很清楚如何通过使用计时器来解决UI冻结问题。但是如果您的UI由于下载而冻结,那么您可以尝试asynchronous loading而不是使用计时器或分离另一个线程。

编辑:除非您为辅助线程配置运行循环,否则计时器不会从该线程起作用。检查线程编程指南中的run loop management。与使用异步连接相比,这可能是一项非常困难的工作。