现在我有一个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)
}
我不确定我应该做什么。这似乎在某些情况下有效,但大部分时间都没有。
如何异步发送正在后台线程上某处加载的数据,并在需要时可靠地显示它?
答案 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
中的图像更容易设置。