【问题标题】:UITableView can't scroll while refreshingUITableView 刷新时无法滚动
【发布时间】:2015-10-03 02:53:13
【问题描述】:

使用 Parse 我正在下载图像、文本等并在表格视图单元格中使用它们。但是,在刷新时(当指示器在导航栏中显示动画时)我无法在应用程序上滚动或移动。就好像应用程序在表格视图完成刷新之前变得无响应。

非常感谢任何帮助。

【问题讨论】:

  • 因为你是同步下载的,需要时间,所以你阻塞了界面。在现实生活中,如果您这样做,WatchDog 进程将在用户眼前杀死您的应用程序。做一些研究;这个问题到处都是 Stack Overflow(解决方案也是如此)。
  • 您应该在后台线程中下载数据,如果您在主线程中执行这些操作,则会阻塞 UI。

标签: ios xcode swift uitableview parse-platform


【解决方案1】:

就像一些 cmets 已经说过的那样,这是由于所谓的“阻塞主线程”。请参阅 this 很棒的教程以了解有关 Swift 中并发的更多信息。您在 Parse 查询上调用的 WithBlockInBackground 方法应该异步调用它。如果由于某种原因仍然存在问题,则应将 Parse 查询嵌套在 dispatch_async 块中。 Here's 有关如何执行此操作的有用教程。

注意:始终在您的 线程上更新 UI。如果你不这样做,坏事就会发生。

【讨论】:

  • 这可行,但在使用 findObjectsInBackgroundWithBlock 时加载任何内容似乎需要很长时间。我应该只使用 Swift 代码吗?
  • 如果您正在下载图像,那么您是对的,这需要一段时间,因为您不会在每次下载新图像时都刷新表格视图。在这种情况下,您可以解决此问题。虽然它没有实现 Parse,但我通过这个视频学习并强烈推荐它:youtube.com/watch?v=gyluPwsPZ8c。原则是一样的。
【解决方案2】:

这是一个简单的示例,说明如何分派到不同的线程,下载图像并在下载完成后返回主线程。

func downloadImageAndUpdateUI(){
    imageView?.image = nil

    if let imageUrl = aValidUrl{
        //get image on another thread
        let qos = Int(QOS_CLASS_BACKGROUND.rawValue)
        dispatch_async(dispatch_get_global_queue(qos, 0), {
            let imageData = NSData(contentsOfURL: imageUrl)
            //get back to main thread
            dispatch_async(dispatch_get_main_queue(), {
                if imageUrl == self.requestedImageUrl { //making sure if this image is still needed (or if user havent moved on to something else)
                    if imageData != nil{
                        self.imageView.image = UIImage(data: imageData!)
                    }
                }
            })
        })
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多