【问题标题】:implementing UIActivityIndicatorView while NSData dataWithContentsOfURL is downloading在 NSData dataWithContentsOfURL 正在下载时实现 UIActivityIndi​​catorView
【发布时间】:2010-05-10 15:33:44
【问题描述】:

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

它在 UIViewController 中,我第一次尝试通过放入 UIActivityIndi​​catorView 并在开始下载之前开始旋转,然后停止旋转但没有出现任何内容。

所以我的问题真的是请有人告诉我处理这个问题的最佳方法是什么?非常感谢

【问题讨论】:

    标签: iphone loader uiactivityindicatorview download


    【解决方案1】:

    什么都不会出现,因为你的主线程在下载时被阻塞了,而主线程是 UI 更新发生的地方。

    您应该使用NSUrlConnection 异步下载并实现委托方法来启动/停止您的微调器。

    或者,如果您想坚持使用NSDatadataWithContentsOfURL:url,您应该在单独的线程上执行此操作,并在调用它之前和之后更新主线程上的微调器。

    【讨论】:

    • 并且使用状态栏的activityIndi​​cator而不是一个大的突兀的微调器;在不完全必要时让用户等待是糟糕的用户体验。
    • 干杯伙伴 NSUrlconnection 正是我想要的!已经让它与 uiprogress 视图一起使用
    【解决方案2】:

    您可以在仍然使用同步方法的同时实现这一点,但您需要在开始下载之前让运行循环有机会开始为活动指示器设置动画。

    您可以通过使用延迟为 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)。

    【讨论】:

    • +1 添加延迟以使指标启动效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多