Как узнать, что релиз фильма закончился? - PullRequest
0 голосов
/ 05 июня 2010

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

[релиз фильма]; [self executeSelector: @selector (playButtonClicked) withObject: nil afterDelay: 1];

Однако я не хочу всегда откладывать на 1 секунду. Я хочу запустить «playButtonClicked», как только «TheMovie» будет полностью выпущен. Я попробовал следующий код, но он не работал, потому что [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];
}

С нетерпением ждем помощи. Спасибо.

1 Ответ

1 голос
/ 05 июня 2010

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

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

[theMovie release];
[self playButtonClicked];

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

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

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

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

...