2015-12-13 17 views
0

我有問題,從解析並將它們加載到表視圖中獲取用戶圖像..我認爲這是與userId /字符串和指針buissness!Swift - 解析並顯示圖像時遇到的問題

圖片上傳正常解析,我可以看到它們,但我似乎無法下載它們。我的代碼很明顯是問題,我無法弄清楚哪一部分。

在解析userId是一個指向用戶類的指針,所以我敢肯定,我已經做了一些錯誤的連接它..!我是新來的快速&解析,所以我仍然有點難以理解這一切。

這裏是我的代碼如下,如果有人明白這個問題,我會喜歡它,如果你能告訴我!

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 
} 

} 

回答

1

你的用戶id指針中提到的問題是在這裏:

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

或者,我會建議考慮使用PFImageViewParseUI框架。在查詢完成後,將PFFiles中的每一個分配給PFImageView,然後在每個PFImageView上調用loadInBackground。數據加載後,PFImageView類會自動處理更新圖像。

+1

嗯,我加了reloadData。但仍然沒有,我不知道它的連接解析,可能是因爲你上面提到的字符串buissness? – Charles

+1

如果指針/字符串的東西不是先固定的,它將不起作用。 'PFFiles'作爲'Post'查詢的一部分返回。只要有一個「指針等於一個字符串」的無效約束,該查詢就不會返回任何對象,這絕不會發生。 – Russell