如何识别AVAudioPlayer正在播放这首歌

时间:2013-08-27 10:12:14

标签: ios avaudioplayer

我正在用AVAudioPlayer播放一首歌。实际上我是在url的帮助下从服务器数据库中流式传输这首歌的。像这样

NSURL * url = [NSURL URLWithString:@"myAudioURl"];
  NSData *data = [NSData dataWithContentsOfURL:url];    
  audioplayer = [[AVAudioPlayer alloc] initWithData:data error:nil];

虽然检索它需要几秒钟。所以想要旋转ActivityIndi​​cator直到歌曲播放。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

你的问题是:

NSData *data = [NSData dataWithContentsOfURL:url];

这是在iOS上下载数据的最糟糕方式之一,原因有很多。首先,它是同步的,所以如果你在主线程上调用它,它就是一个阻塞操作(意味着整个UI都会冻结)。快速WiFi连接只需几秒钟,在蜂窝连接上可能需要一分钟或更长时间。

这也很糟糕,因为它没有为您提供任何进展或状态更新。如果下载失败,您将不会知道为什么它出错了。无论是用户的网络连接,服务器还是完全不同的东西,你都会陷入黑暗......

因此,即使您在后台线程上运行dataWithContentsOfURL,它仍然远非理想,因为它不会为您提供任何错误处理或进度更新。

更好的方法是使用NSURLConnection,它提供基于块的异步下载方法以及完成失败处理程序。许多开发人员更喜欢使用NSURLConnection的更高级抽象,例如流行的AFNetworking。 StackOverflow上有很多关于使用这两者的最佳实践的问题。