ios - 在等待数据的同时导航到新 View Controller 的最佳实践

标签 ios swift asynchronous parse-platform

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

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

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

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)
}

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

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

最佳答案

将您的 dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0) block 移动到被推送的 View Controller 的 viewWillAppear()

实际上,您不需要使用 dispatch_async,因为您已经在调用异步 PFQuery。所以你的 View Controller 的 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 设置图像变得更加容易。

关于ios - 在等待数据的同时导航到新 View Controller 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34160922/

相关文章:

ios - Firebase 值未被删除

c++ - handle_info() 无法同时执行多个调用

ios - 如何在 Visual Studio 和 Mac 中同时使用 Xamarin

ios - 自定义 UISlider 外观

swift - Swift 命令的 LLDB 别名

swift - 如何在swift中比较CGPoints?

ios - 如何在 Swift 上使用 UIbezierPath 制作通用圆形绘图(使用 lineDashPattern)

ios - 无法在 ios 中使用带有自定义按钮的 api v2.4 登录 facebook

javascript - AngularJS - 无法获取在指令的 TemplateUrl 中使用 Promise 的工厂方法的解析值

java - 我应该在每个服务方法上放置 @Async 以使我的应用程序完全支持 Spring 中的异步吗?