我正在使用NSData dataWithContentsOfURL:url下载一个mp3。这需要一段时间,而文件下载时应用程序挂起。我想要处理得很好,理想的想要显示下载进度,但找不到相应的方法。
它位于UIViewController中,我首先尝试通过放置UIActivityIndicatorView并在开始下载之前启动它,然后停止旋转但没有出现。
所以我的问题真的是请有人告诉我最好的办法是什么?非常感谢
答案 0 :(得分:4)
没有任何内容会出现,因为你的主线程被阻止进行下载,主线程就是UI更新的地方。
您应该使用NSUrlConnection异步下载并实现委托方法来启动/停止您的微调器。
或者,如果你想坚持NSData
的{{1}},你应该在一个单独的线程上执行此操作,并在调用它之前和之后更新主线程上的微调器。
答案 1 :(得分:3)
您可以在使用同步方法的同时实现此目的,但是在开始下载之前,您需要为运行循环提供启动活动指示器动画的机会。
你可以通过使用延迟为0的performSelector:withObject:afterDelay:
在动画开始和下载之间放置一个运行循环来实现这一点,或者(更糟糕的风格,更危险)你可以直接调用代码中的运行循环。
示例代码:
- (void)loadPart1 {
activityIndicator = [[[UIActivityIndicatorView alloc]
initWithActivityIndicatorStyle:UIA...StyleGray]
autorelease];
activityIndicator.frame = myFrame;
[self.view addSubview:activityIndicator];
[activityIndicator startAnimating];
[self performSelector:@selector(loadPart2) withObject:nil afterDelay:0];
}
- (void)loadPart2 {
[NSURLConnection sendSynchronousRequest:request returningResponse:&response
error:&error];
[activityIndicator stopAnimating];
}
此处有更多详情: http://bynomial.com/blog/?p=15 (向下滚动到解决方案1或解决方案2)。