我必须使用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");
}
答案 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。与使用异步连接相比,这可能是一项非常困难的工作。