我正在用AVAudioPlayer播放一首歌。实际上我是在url的帮助下从服务器数据库中流式传输这首歌的。像这样
NSURL * url = [NSURL URLWithString:@"myAudioURl"];
NSData *data = [NSData dataWithContentsOfURL:url];
audioplayer = [[AVAudioPlayer alloc] initWithData:data error:nil];
虽然检索它需要几秒钟。所以想要旋转ActivityIndicator直到歌曲播放。我怎么能这样做?
答案 0 :(得分:0)
你的问题是:
NSData *data = [NSData dataWithContentsOfURL:url];
这是在iOS上下载数据的最糟糕方式之一,原因有很多。首先,它是同步的,所以如果你在主线程上调用它,它就是一个阻塞操作(意味着整个UI都会冻结)。快速WiFi连接只需几秒钟,在蜂窝连接上可能需要一分钟或更长时间。
这也很糟糕,因为它没有为您提供任何进展或状态更新。如果下载失败,您将不会知道为什么它出错了。无论是用户的网络连接,服务器还是完全不同的东西,你都会陷入黑暗......
因此,即使您在后台线程上运行dataWithContentsOfURL
,它仍然远非理想,因为它不会为您提供任何错误处理或进度更新。
更好的方法是使用NSURLConnection
,它提供基于块的异步下载方法以及完成和失败处理程序。许多开发人员更喜欢使用NSURLConnection
的更高级抽象,例如流行的AFNetworking
。 StackOverflow上有很多关于使用这两者的最佳实践的问题。