2010-06-05 4 views
0

Я собираюсь освободить киноплеер (theMovie), а затем начать другое действие (так называемое playButtonClicked) после его полной версии. Я использовал performSelector для задержки «playButtonClicked» в течение 1 секунды, и он работает хорошо. Код:Как узнать выпуск фильма?

[theMovie release]; [self performSelector: @selector (playButtonClicked) withObject: nil afterDelay: 1];

Однако я не хочу, чтобы всегда откладывать 1 секунду. Я хочу запустить «playButtonClicked», как только «theMovie» будет полностью выпущен. Я попробовал следующий код, но это не сработало, потому что [timer userInfo] никогда не является ничем. Кто-нибудь знает, как проверить выпуск фильма.

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

Порадуйтесь помогает. Спасибо.

ответ

1

Нет необходимости.

Если вы просто отпустить игрока, а затем вызвать playButtonClicked, как это:

[theMovie release]; 
[self playButtonClicked]; 

Он не будет выполнять вторую строку, пока первый не будет завершен, или до тех пор, theMovie отпущена. Это все в одной и той же цепочке, чтобы она выполнялась по порядку. Для этого вам не нужен таймер. Хотя в ситуациях, когда то, что вы ожидаете завершить, выполняется в новом потоке, вы должны использовать обратный вызов, а не гадать, сколько времени потребуется (это намного меньше 1 секунды!).

Кроме того, вы просто не понимаете, что «полностью освобождение» просто вычитает значение keepCount на единицу. Он автоматически освободится, когда достигнет нуля.

Как примечание, почему важно, чтобы theMovie был освобожден (освобожден?), Прежде чем будет выполнен playButtonClicked?

Кроме того, ваш waitForReleaseFinish: код будет работать, но это не нужно, потому что theMovie будет выпущен до создания таймера.

+0

Благодарим вас за ответ. Это звучит разумно. К сожалению, если я не задерживаю 1-сек (даже 0,5 с), программа работает неправильно. релиз theMovie находится в «moviePlayerDidFinsh», а затем начинает играть другой фильм. Поскольку в игре {}, TheMoive снова воссоздается, он должен быть выпущен первым. MPMoviePlayerController * mp = [[MPMoviePlayerController alloc] initWithContentURL: [self getMovieURL]]; \t если (тр) \t { \t \t // сохранить объект фильма игрок \t \t self.theMovie = тр; \t \t [mp release]; \t} – vicky

+0

Если theMovie является сохраняющим свойством, он должен высвободить старое значение самостоятельно. Поэтому, если theMovie является сохраняющим свойством (и это должно быть), вы не должны вручную его выпускать. Просто позвоните [self playButtonClicked], и когда вы установите свойство для нового проигрывателя видео, он выпустит старый. – mk12

Смежные вопросы