在下载NSData dataWithContentsOfURL时实现UIActivityIndi​​catorView

时间:2010-05-10 15:33:45

标签: iphone loader uiactivityindicatorview downloading

我正在使用NSData dataWithContentsOfURL:url下载一个mp3。这需要一段时间,而文件下载时应用程序挂起。我想要处理得很好,理想的想要显示下载进度,但找不到相应的方法。

它位于UIViewController中,我首先尝试通过放置UIActivityIndi​​catorView并在开始下载之前启动它,然后停止旋转但没有出现。

所以我的问题真的是请有人告诉我最好的办法是什么?非常感谢

2 个答案:

答案 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)。