现在我有一个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/