ios - Swift - 从解析中接收图像并显示它们时出现问题

标签 ios swift parse-platform

我在从解析中获取用户图像并将它们加载到 TableView 时遇到问题。我认为这与 userId/Strings 和指针业务有关!

上传的图片可以很好地解析,我可以看到它们,但我似乎无法下载它们。我的代码绝对是问题所在,我只是不知道是哪一部分。

在解析时,userId 是一个指向用户类的指针,所以我很确定我在连接它们时做错了……!我是 swift 和 Parse 的新手,所以我仍然很难理解这一切。

下面是我的代码,如果有人理解这个问题,如果你能告诉我,我会很高兴!!

import UIKit 
import Parse 

class TimelineTableViewController: UITableViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIPopoverPresentationControllerDelegate { 

@IBOutlet var feedTableView: UITableView! 
var refresher:UIRefreshControl! 

var titles = [String]() 
var username = [String]() 
var imageFiles = [PFFile]() 
var users = [String: String]() 



override func viewDidLoad() { 
super.viewDidLoad() 

let query = PFUser.query() 
query?.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in 
if let users = objects { 
self.titles.removeAll(keepCapacity: true) 
self.imageFiles.removeAll(keepCapacity: true) 
self.users.removeAll(keepCapacity: true) 
self.username.removeAll(keepCapacity: true) 
for object in users { 
if let user = object as? PFUser { 
self.users[user.objectId!] = user.username! 

} 
} 
} 



let getFollowedUsersQuery = PFQuery(className: "followers") 
getFollowedUsersQuery.whereKey("follower", equalTo: PFUser.currentUser()!) 
getFollowedUsersQuery.findObjectsInBackgroundWithBlock { (objects, error) -> Void in 
if let objects = objects { 
for object in objects { 
let followedUser = object ["following"] as! String 
let query = PFQuery(className: "Post") 
query.whereKey("userId", equalTo: followedUser) 
query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in 
if let objects = objects { 
for object in objects { 
self.titles.append(object["title"]! as! String) 
self.imageFiles.append(object["imageFile"]! as! PFFile) 
self.username.append(self.users[object["userId"] as! String]!) 
self.tableView.reloadData() 


} }}) } } } }) 

// Add the refresher 
refresher = UIRefreshControl() 
refresher.attributedTitle = NSAttributedString(string: "") 
refresher.addTarget(self, action: "refreshData", forControlEvents: UIControlEvents.ValueChanged) 
// Add the refresher as a sub view on the tableview 
self.feedTableView.addSubview(refresher) 


} 


func refreshData() -> Void { 
self.refresher.endRefreshing()} 

override func didReceiveMemoryWarning() { 
super.didReceiveMemoryWarning() 
// Dispose of any resources that can be recreated. 
} 


@IBAction func blogPost(sender: AnyObject) { 

} 


@IBAction func CameraPopover(sender: AnyObject) { 

self.performSegueWithIdentifier("cameraPopover", sender: self) 

} 


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

if segue.identifier == "cameraPopover" 
{ 
let vc = segue.destinationViewController 
let controller = vc.popoverPresentationController 

if controller != nil 

{ 
controller?.delegate = self 
vc.preferredContentSize = CGSizeMake(50, 90) 
} 

}} 

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { 

return.None 
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
// #warning Incomplete implementation, return the number of sections 
return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
// #warning Incomplete implementation, return the number of rows 
return username.count 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
let postCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TimelineTableViewCell 

imageFiles[indexPath.row].getDataInBackgroundWithBlock { (data, error) -> Void in 
if let downloadedImage = UIImage(data: data!) { 
postCell.postedImage.image = downloadedImage 

} 
} 

postCell.usernameLabel.text = username[indexPath.row] 
postCell.titleLabel.text = titles[indexPath.row] 

return postCell 
} 

}

最佳答案

您提到的关于 userId 指针的问题在这里:

let followedUser = object ["following"] as! String 
let query = PFQuery(className: "Post") 
query.whereKey("userId", equalTo: followedUser)

您提到 Post 类的 userId 列是一个 User 指针,但是您将其作为字符串引用 followedUser.

关于显示不正常的图片,需要刷新UI才能显示。您正在使用正确的代码加载数据

imageFiles[indexPath.row].getDataInBackgroundWithBlock { (data, error) -> Void in 
if let downloadedImage = UIImage(data: data!) { 
    postCell.postedImage.image = downloadedImage 
}

但是,问题是,由于数据是异步加载的,postCell 将在数据加载之前返回到表中。拿来了。缺少的关键部分是在完成处理程序中使用 self.tableView.reloadData() 刷新表格。

imageFiles[indexPath.row].getDataInBackgroundWithBlock { (data, error) -> Void in 
if let downloadedImage = UIImage(data: data!) { 
    postCell.postedImage.image = downloadedImage
    self.tableView.reloadData()
}

或者,我建议研究使用 ParseUI 框架中的 PFImageView。您在完成查询时将每个 PFFiles 分配给 PFImageView,然后对每个 PFImageView 调用 loadInBackground . PFImageView 类会在加载数据后自动处理更新图像。

关于ios - Swift - 从解析中接收图像并显示它们时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34253391/

相关文章:

java - 解析 : How to set a pointer in Android?

android - 解析 Android - getCurrentUser() objectId 在 twitter 登录后为空

objective-c - 带有 UITextField 的 UIPicker

IOS:如何在用户拒绝时获取 CLLocationManager 警报

ios - 我的 iOS 应用程序崩溃报告中的 SIGSEGV 异常

ios - 用于 iOS 应用程序的最佳数据库

swift - 找不到“Parse/ParseClientConfiguration.h”文件

iphone - objective-c int 进行双重计算

ios - 异步获取 Swift Xcode

ios - 函数在 Swift 中不起作用