可可触摸 - 线程和动画

时间:2011-03-09 17:41:27

标签: iphone cocoa-touch

我正在接近可可提供的新线程。 特别是,我正在使用

创建一个新线程
[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命令之后显示我的图像。 有什么想法吗?

感谢。

2 个答案:

答案 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: