2010-03-27 4 views
0

У меня есть 2 метода. Один метод начинает воспроизведение аудиофайла (.mp3), . Другой метод обновляет UIToolBar, чтобы показать кнопку (PLAY или PAUSE). Эти два метода вызываются в следующем порядке:Как принудительно выполнить один метод перед другим методом?

//Adds some UIBarButtonItems to a UIToolBar 
[self togglePlayer]; 
//Uses AVAudioPlayer 
[audioPlayer play]; 

TogglePlayer делает это:

-(void)togglePlayer 
{ 

    NSLog(@"Toggling Player"); 

    NSArray *barButtonItems; 
    UIBarButtonItem *barButtonSpaceL; 
    UIBarButtonItem *barButtonSpaceR; 
    UIBarButtonItem *barButtonItemPlayer; 
    UIBarButtonItem *barButtonItemCancel; 
    UIBarButtonItem *barButtonItemLyrics; 
    UIBarButtonItem *barButtonItemTweet; 

    if([myToolbar.items count] > 0){ 

     NSEnumerator *enumerator = [myToolbar.items objectEnumerator]; 
     id object; 
     while ((object = [enumerator nextObject])) { 

      [object release]; 
      object = nil; 
     } 
    } 

    if(!downloadInProgress){ 

    barButtonSpaceL = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; 
    barButtonSpaceR = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; 

    if(thePlayerState == PLAYER_PLAYING){ 
    barButtonItemPlayer = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"pauseIcon.png"] style:UIBarButtonItemStylePlain target:self action:@selector(pauseButtonPressed:)]; 
    barButtonItemLyrics = [[UIBarButtonItem alloc] initWithTitle:@"Lyrics" style:UIBarButtonItemStyleBordered target:self action:@selector(switchPageLyrics:)]; 
    barButtonItemTweet = [[UIBarButtonItem alloc] initWithTitle:@"Tweet This" style:UIBarButtonItemStyleBordered target:self action:@selector(tweetSong:)]; 

     if(canTweet){ 
     barButtonItems = [NSArray arrayWithObjects:barButtonItemTweet, barButtonSpaceR, barButtonItemPlayer, barButtonSpaceL, barButtonItemLyrics, nil]; 
     }else{ 
     barButtonItems = [NSArray arrayWithObjects:barButtonItemPlayer, barButtonSpaceR, barButtonItemLyrics, nil];   
     } 

    }else if(thePlayerState == PLAYER_PAUSED){ 

    barButtonItemPlayer = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"playIcon.png"] style:UIBarButtonItemStylePlain target:self action:@selector(playButtonPressed:)]; 
    barButtonItemLyrics = [[UIBarButtonItem alloc] initWithTitle:@"Lyrics" style:UIBarButtonItemStyleBordered target:self action:@selector(switchPageLyrics:)]; 
    barButtonItemTweet = [[UIBarButtonItem alloc] initWithTitle:@"Tweet This" style:UIBarButtonItemStyleBordered target:self action:@selector(tweetSong:)]; 


     if(canTweet){ 
      barButtonItems = [NSArray arrayWithObjects:barButtonItemTweet, barButtonSpaceR, barButtonItemPlayer, barButtonSpaceL, barButtonItemLyrics, nil]; 
     }else{ 
      barButtonItems = [NSArray arrayWithObjects:barButtonItemPlayer, barButtonSpaceR, barButtonItemLyrics, nil];   
     } 

    }else{ 

    //PLAYER OFF  
    barButtonItems = [NSArray arrayWithObjects:barButtonSpaceL, nil]; 

    } 
     [myToolbar setItems:barButtonItems];  

    }else{ 


     barButtonSpaceL = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; 
     barButtonSpaceR = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; 
     barButtonItemCancel = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"VC1_DownloadCancel", @"") style:UIBarButtonItemStyleBordered target:self action:@selector(downloadCancelled:)];   

     if(thePlayerState == PLAYER_PLAYING){ 
      barButtonItemPlayer = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"pauseIcon.png"] style:UIBarButtonItemStylePlain target:self action:@selector(pauseButtonPressed:)]; 
      barButtonItems = [NSArray arrayWithObjects:barButtonItemPlayer, barButtonSpaceR, barButtonItemCancel, nil]; 

     }else if(thePlayerState == PLAYER_PAUSED){ 
      barButtonItemPlayer = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"playIcon.png"] style:UIBarButtonItemStylePlain target:self action:@selector(playButtonPressed:)]; 
      barButtonItems = [NSArray arrayWithObjects:barButtonItemPlayer, barButtonSpaceR, barButtonItemCancel, nil]; 

     }else{ 

     //PLAYER OFF 
      barButtonItems = [NSArray arrayWithObjects:barButtonSpaceL, barButtonItemCancel, barButtonSpaceR, nil]; 
     } 

     [myToolbar setItems:barButtonItems]; 


    } 

} 

Я вызывать методы в указанном выше порядке, так что кнопка (пауза) будет показано, в то время, начинается песня. Но проблема в том, что песня начинает играть сначала, а UIToolBar остается неизменным довольно долго (от 2 до 5 секунд), пока кнопка не будет добавлена ​​и не показана.

Я хочу, чтобы кнопка отображалась одновременно с началом воспроизведения песни (то есть без задержки). Есть какой-либо способ сделать это?

+0

Священные утечки памяти, Бэтмен! У вас '+ alloc''с целая пучка кнопок, но никогда не' -release' их. –

ответ

2

, чтобы обновить gui, вам нужно будет дать ему возможность фактически обновить gui. Поскольку воспроизведение звука происходит в другом потоке, оно сразу начнет воспроизводиться. Однако, поскольку вы, вероятно, находитесь в событии от gui (например, как событие touch), и вы не вернулись с этой функции, код, ответственный за обновление gui, еще не запущен.

См http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ApplicationEnvironment/ApplicationEnvironment.html#//apple_ref/doc/uid/TP40007072-CH7-SW2 для получения информации о Cocoa Framework

Используя эту функцию для вызова игр должны работать так, как вы хотите. это приведет к тому, что событие вызовет воспроизведение после обработки текущего события.

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay 

Ваш пример:

//Adds some UIBarButtonItems to a UIToolBar 
[self togglePlayer]; 
//Uses AVAudioPlayer 
[audioPlayer performSelector:@SEL(play) withObject:nil afterDelay:0]; 
1

Другой подход мог бы подготовить систему для воспроизведения звукового файла, используя

[audioPlayer prepareToPlay]; 

где-то в коде инициализации, например, в viewDidLoad. Таким образом, все будет установлено, если вы хотите, чтобы звук воспроизводился, а метод play не приведет к значительной задержке. (не в вашем коде пользовательского интерфейса, а не в реальном воспроизведении)