【问题标题】:Best practice for navigating to new view controller while still waiting for data在等待数据时导航到新视图控制器的最佳实践
【发布时间】:2015-12-08 16:23:12
【问题描述】:

现在我有一个 tableviewcontroller。当我单击其中一个单元格时,我会转到一个新的视图控制器,它显示有关我单击的项目的详细信息。

有时我需要的所有信息都尚未加载(尤其是在连接速度较慢的情况下),所以即使在 segue 之后,我也会尝试在后台加载它。我知道我可以冻结主线程并等待我的数据加载,但我宁愿有一个流畅的界面。

例如,如果尚未加载用户的个人资料图片,则会显示占位符图片并在加载真实图片时替换。但我似乎无法让这种行为起作用。这是我现在正在做的事情:

func onItemTap(send:AnyObject){

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc: OtherViewController = storyboard.instantiateViewControllerWithIdentifier("OtherViewController") as! OtherViewController

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), {

        while(self.parseUser == nil){//wait for it to load}
        let profImage = (self.parseUser?.valueForKey("profilePictureLarge") as! PFFile)
        profImage.getDataInBackgroundWithBlock({
            (imageData: NSData?, error: NSError?) -> Void in
            if (error == nil) && vc.profileImageView != nil{

                vc.profileImageView.image = UIImage(data: imageData!)
                vc.userNameLabel.text = self.parseUser?.valueForKey("displayName") as? String
                vc.parseUser = self.parseUser
                vc.pfObject = self.parseObject
            }
        })
    })
    //these are sent no matter what, but are replaced by background thread if needed
    vc.parseUser = self.parseUser
    vc.pfObject = self.parseObject

    holder?.navigationController?.pushViewController(vc, animated: true)
}

我不确定我真正应该做什么。这似乎在某些情况下有效,但在大多数情况下根本不起作用。

如何异步发送正在后台线程某处加载的数据,并在我需要时可靠地显示它?

【问题讨论】:

  • 为避免出现问题,您可以在请求完成之前使用进度 hud 阻止列表视图控制器,或者使用活动指示器显示空白详细信息视图控制器,并在请求完成时显示您的信息

标签: ios swift asynchronous parse-platform


【解决方案1】:

将dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0) 块移动到被推送的视图控制器的viewWillAppear()。

实际上你不需要使用dispatch_async,因为你已经在调用异步PFQuery。所以你的 viewcontroller 的 viewWillAppear() 方法看起来像这样:

override func viewWillAppear(animated: Bool){

  self.userNameLabel.text = self.parseUser?.valueForKey("displayName") as? String
  let profImage = (self.parseUser?.valueForKey("profilePictureLarge") as! PFFile)

  profImage.getDataInBackgroundWithBlock({ (imageData: NSData?, error: NSError?) in
    if (error == nil) && self.profileImageView != nil{     
      self.profileImageView.image = UIImage(data: imageData!)
    }
  })

}

此外,如果可以,请查看PFImageView 文档(位于ParseUI.framework 中)。 它使从PFFile 设置图像变得更加容易。

【讨论】:

  • 这个问题是我必须等到 parseUser 加载到前一个视图上才能将它发送到这个视图。否则当我到达这里时它总是为零,我不能做任何这些。
  • 下载用户数据究竟需要花费多少时间?也许您可以将下载过程推迟到需要数据的那一刻?
  • 哈哈,我现在觉得很傻。花了这么长时间的原因是我在 parseUser 的遗嘱集上做了太多的事情。所以我在它甚至可以解决之前加载了几张图像。我认为这是我问题的真正根源。在你问这个问题之前,我从没想过它太大了:)
  • 很高兴您找到了解决方案!如果问题仍然存在,请回复。
  • 现在完美运行!我将所有这些工作委托给一个新函数并将其命名为 njuriSavedMyLife() 以纪念您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 2015-10-22
相关资源
最近更新 更多