我正在接近可可提供的新线程。 特别是,我正在使用
创建一个新线程[NSThread detachNewThreadSelector:@selector(myMethod) toTarget:self withObject:nil];
方法
到目前为止,一切都很好,但我遇到了一种奇怪的行为,也许你可以向我澄清这些事情。 例如,我的主题是:
-(void)myMethod{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *img=[UIImage imageNamed:@"animage.png"];
UIImageView *imgV=[[UIImageView alloc]init];
[self.view addSubview:imgV];
[imgV setFrame:CGRectMake(100, 100, 200, 200)];
[imgV setImage:img];
[NSThread sleepForTimeInterval:10.5];
[imgV release];
[pool release];
}
我无法理解为什么在sleepForTimeInterval命令之后显示我的图像。 有什么想法吗?
感谢。
答案 0 :(得分:1)
任何与UI相关的内容都应该在主线程上完成。我认为正确的顺序可能是:(注意addView的“performSelectorOnMainThread”)
-(void)myMethod{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *img=[UIImage imageNamed:@"animage.png"];
UIImageView *imgV=[[UIImageView alloc]init];
[imgV setFrame:CGRectMake(100, 100, 200, 200)];
[imgV setImage:img];
[self.view performSelectorOnMainThread:@selector(addSubview:) withObject:imgV waitUntilDone:YES];
[imgV release];
[pool release];
}
希望我记得那是对的。
答案 1 :(得分:0)
代码中的一个问题是UI方法只能从主线程调用。这不会导致你的问题,但无论如何你应该修复它。
继续显示图像的原因是您永远不会从其超级视图中删除UIImageView(即通过发送removeFromSuperview
)。
编辑,以回应澄清:
如果您要在主线程上运行该方法,则您的UI将在sleepForTimeInterval:
正在运行的10.5秒内无响应,因为UI更新仅在“主循环”运行时发生且{{ 1}}防止这种情况。可能同样的现象是阻止后台线程的更新被处理,或者它可能只是在后台线程上进行UI调用的副作用。如果要从后台线程调整UI,则必须使用sleepForTimeInterval:
使方法在主线程上运行。
但是你想在这里做什么,你甚至不需要线程。只需在主线程中添加图像视图,然后使用performSelectorOnMainThread:withObject:waitUntilDone:
在10.5秒后删除图像视图。
performSelector:withObject:afterDelay: