1

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

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

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

4

1 回答 1

0

你的问题是这样的:

NSData *data = [NSData dataWithContentsOfURL:url];

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

这也很糟糕,因为它没有为您提供任何形式的进度或状态更新。如果下载失败,您将不知道为什么会出错。您将一无所知,无论是您的用户的网络连接,服务器还是完全不同的东西……

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

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

于 2013-08-28T09:06:24.060 回答