0

我有两种方法。一种方法开始播放音频文件 (.mp3),另一种方法更新 UIToolBar 以显示按钮(播放或暂停)。这两个方法按以下顺序调用:

//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 秒)保持不变,直到添加并显示按钮。

我想要的是在歌曲开始播放的同时显示按钮(即无延迟)。有没有办法做到这一点?

4

2 回答 2

2

为了更新 gui,您需要给它一个实际更新 gui 的机会。由于音频播放发生在不同的线程中,它将立即开始播放。但是,由于您可能处于来自 gui 的事件中(例如触摸事件)并且您尚未从该函数返回,因此负责更新 gui 的代码尚未运行。

有关Cocoa 框架的信息,请参阅http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ApplicationEnvironment/ApplicationEnvironment.html#//apple_ref/doc/uid/TP40007072-CH7-SW2

使用此函数调用 play 应该按照您想要的方式工作。这将在处理当前事件后将事件调用播放。

- (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];
于 2010-03-27T13:37:12.250 回答
1

另一种方法可能是准备系统播放您的音频文件,使用

[audioPlayer prepareToPlay];

在您的初始化代码中的某处,例如在viewDidLoad. 这样,一旦您想要播放音频,所有内容都将被设置,并且该play方法不会导致明显的延迟。(不在您的用户界面代码中,也不在实际播放中)

于 2010-11-18T01:57:30.860 回答