我的目标是发布一个电影播放器(theMovie),然后在它完全发布后开始另一个动作(所谓的playButtonClicked)。我使用performSelector来延迟“playButtonClicked”1秒,它运行良好。代码是:
[电影发布]; [self performSelector:@selector(playButtonClicked)withObject:nil afterDelay:1];
但是,我不想总是延迟1秒。我想在“theMovie”完全发布后立即启动“playButtonClicked”。我尝试了以下代码,但它没有用,因为[timer userInfo]永远不会是nil。 有人知道如何检查完成的电影播放器发布。
[theMovie release];
//[self performSelector:@selector(playButtonClicked) withObject:nil afterDelay:1];
NSTimer *atimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self
selector:@selector(waitForReleaseFinish:)
userInfo: (MPMoviePlayerController*) theMovie repeats:YES];
waitForRleaseFinish:(NSTimer *)计时器的代码是:
if ([timer userInfo]==nil) //here I actually want to test if (theMovie==nil),but I don't know how to do and I'm not sure if it is a correct way to determine the release finished.
{
[timer invalidate];
[self playButtonClicked];
}
期待有所帮助。谢谢。
答案 0 :(得分:1)
没有必要。
如果您只是释放播放器然后调用playButtonClicked,就像这样:
[theMovie release];
[self playButtonClicked];
在第一行完成之前,或者直到theMovie被释放之前,它不会执行第二行。这都在同一个线程上,因此它将按顺序执行。你不需要计时器。虽然在等待完成的内容在新线程上执行的情况下,您将使用回调,而不是猜测它需要多长时间(这远远小于1秒!)。
另外,只是因为你没有误解,“完全释放”只是将retainCount减去一。它会在达到零时自动解除分配。
作为旁注,为什么在执行playButtonClicked之前发布电影(解除分配?)为何很重要?
此外,您的waitForReleaseFinish:代码将工作,但这是不必要的,因为在创建计时器之前将释放电影。