在等待数据的同时导航到新视图控制器的最佳实践

时间:2015-12-08 16:23:13

标签: ios swift asynchronous parse-platform

现在我有一个tableviewcontroller。当我点击其中一个单元格时,我会转到一个新的viewcontroller,它显示我点击的项目的详细信息。

有时并不是我需要的所有信息都已加载(特别是在慢速连接上),所以即使在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)
}

我不确定我应该做什么。这似乎在某些情况下有效,但大部分时间都没有。

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

1 个答案:

答案 0 :(得分:0)

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中的图像更容易设置。