2010-03-27 71 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

神圣的内存泄漏,蝙蝠侠!你已经'分配'了一大堆按钮,但从来没有'释放'它们。 – 2010-03-27 13:57:13

回答

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使用此函数来调用播放应该工作,你想要的方式。这会在您处理当前事件后将该事件放置到呼叫中。

- (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方法不会造成显着的延迟。 (不是在你的用户界面代码,而不是实际的播放)

相关问题