2011-03-09 60 views
0

我正在接近线程可可提供的新方法。 特别是,我创建一个新的线程使用可可触摸 - 线程和动画

[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

我还没有意识到这一点。完成。 – Lorenzo 2011-03-09 18:05:39

回答

1

任何与UI相关的事情都应该在主线程中完成。我认为正确的顺序可能是:(注意“performSelectorOnMainThread”为addView)

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

希望我记得正确的。

+0

我试过了,得到了同样的问题:如果我添加了一些其他包含在线程中等待的命令,只有在方法解析后才会显示图像。那么如何在线程结束之前进行动画制作? – Lorenzo 2011-03-09 18:01:24

+0

...无论如何,我通过设置waitUntilDone解决了:NO。谢谢! – Lorenzo 2011-03-09 18:09:26

0

你的代码中的一个问题是UI方法只能从主线程调用。这并不是你的问题,但你应该修正它。

你的图像继续显示的原因是,你永远不会从其超级视图中删除UIImageView(即通过发送它removeFromSuperview)。


编辑,响应澄清:

如果你在运行的主线程上的方法,你的UI会反应迟钝对于sleepForTimeInterval:运行,为UI更新10.5秒只有在“主循环”正在运行时才会发生,并且sleepForTimeInterval:可以防止出现这种情况。也有可能出现这种情况,即阻止后台线程的更新得到处理,或者只是在后台线程上进行UI调用的副作用。如果您想从后台线程调整UI,则必须使用performSelectorOnMainThread:withObject:waitUntilDone:以使方法在主线程上运行。

但是对于你在这里要做的事情,你甚至不需要线程。只需在主线程中添加图像视图,并使用performSelector:withObject:afterDelay:在10.5秒后移除图像视图。

UIImage *img=[UIImage imageNamed:@"animage.png"]; 
UIImageView *imgV = [[[UIImageView alloc] init] autorelease]; 
[self.view addSubview:imgV]; 
[imgV setFrame:CGRectMake(100, 100, 200, 200)]; 
[imgV setImage:img]; 
[imgV performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:10.5]; 
+0

我在主UI中生成此线程。此外,我的问题是,我的图像显示,但方法结束时。这可以防止我用相同的方法对它进行动画处理。 – Lorenzo 2011-03-09 17:50:25

+0

的确,您正在创建一个新线程,而不是在主线程上进行这些UI调用。 – Anomie 2011-03-09 18:10:40

+0

但是我需要偶尔生成UIImageView(例如按下按钮)并依次生成动画,所以我想到了一个线程。现在,用'[self.view performSelectorOnMainThread:@selector(addSubview :) withObject:imgV waitUntilDone:NO];'指令,它工作正常。 – Lorenzo 2011-03-09 18:16:11