我一直在努力让我的tableview正确加载.count。我必须找到一种方法来告诉tableview,仅在我的图像和文章数组完全填充后才加载。UITableView:推迟重新加载,直到所有数据已在后台下载
否则我将保持在
cell.cellImage?.image = imagesArray[indexPath.row]
内
cellForRowAtIndexPath
输出得到一个
fatal error: Array index out of range
:
NUMBER OF POSTS->0
NUMBER OF IMAGES->0
NUMBER OF POSTS->0
NUMBER OF IMAGES->0
NUMBER OF POSTS->0
NUMBER OF IMAGES->0
POSTSARRAY COUNT->1
POSTSARRAY COUNT->2
POSTSARRAY COUNT->3
POSTSARRAY COUNT->4
NUMBER OF POSTS->4
NUMBER OF IMAGES->0
IMAGESARRAY COUNT->1
IMAGESARRAY COUNT->2
IMAGESARRAY COUNT->3
IMAGESARRAY COUNT->4
NUMBER OF POSTS->4
NUMBER OF IMAGES->4
代码
override func viewDidLoad() {
super.viewDidLoad()
// myTableView.estimatedRowHeight = 312.0
// myTableView.rowHeight = UITableViewAutomaticDimension
var query = PFQuery(className: "Post")
query.whereKey("hobbieTag", equalTo:"\(selectedHobbie)")
query.orderByAscending("description")
query.findObjectsInBackgroundWithBlock
{
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil
{
// println("HOBBIES.COUNT->\(hobbies?.count)")
for post in objects!
{
//GET POST TITLE
self.posts.append(post["postText"] as! String)
println("POSTSARRAY COUNT->\(self.posts.count)")
//TEST IMAGE
//var appendImage = UIImage(named: "logoPDF")
//self.imagesArray.append(appendImage!)
//GET IMAGE FILE
let postImageFile = post["postImage"] as? PFFile
postImageFile?.getDataInBackgroundWithBlock({ (imageData: NSData?, error: NSError?) -> Void in
var image = UIImage(data: imageData!)
self.imagesArray.append(image!)
println("IMAGESARRAY COUNT->\(self.imagesArray.count)")
}, progressBlock: { (progress: Int32) -> Void in
// println("PROGRESS->\(progress)")
})
}
self.myTableView.reloadData()
}
else
{
println(error?.localizedDescription)
println(error?.code)
}
// self.myTableView.reloadData()
}//END query
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewDidAppear(animated: Bool) {
myTableView.reloadData()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
println("NUMBER OF POSTS->\(posts.count)")
println("NUMBER OF IMAGES->\(imagesArray.count)")
return posts.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellIdentifier = "Cell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! HobbieFeedTableViewCell
cell.cellTitle.text = posts[indexPath.row]
cell.cellSubtitle.text = posts[indexPath.row]
// cell.cellImage.image = UIImage(named: "logoPDF")
//cell.cellImage?.image = imagesArray[indexPath.row]
return cell
}
更新代码
var query = PFQuery(className: "HobbieFeed")
query.whereKey("hobbieTag", equalTo:"\(selectedHobbie)")
query.orderByAscending("description")
query.findObjectsInBackgroundWithBlock
{
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil
{
let semaphore = dispatch_semaphore_create(0)
// println("HOBBIES.COUNT->\(hobbies?.count)")
for post in objects!
{
//GET POST TITLE
self.posts.append(post["postText"] as! String)
println("POSTSARRAY COUNT->\(self.posts.count)")
//TEST IMAGE
//var appendImage = UIImage(named: "logoPDF")
//self.imagesArray.append(appendImage!)
//GET IMAGE FILE
let postImageFile = post["postImage"] as? PFFile
postImageFile?.getDataInBackgroundWithBlock({ (imageData: NSData?, error: NSError?) -> Void in
var image = UIImage(data: imageData!)
self.imagesArray.append(image!)
println("IMAGESARRAY COUNT->\(self.imagesArray.count)")
dispatch_semaphore_signal(semaphore)
}, progressBlock: { (progress: Int32) -> Void in
println("PROGRESS->\(progress)")
})
}
// Wait for all image loading tasks to complete
for post in objects! {
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
println("SHAPHORE POSTS COUNT->\(self.posts.count)")
println("SEMAPHORE IMAGES COUNT->\(self.imagesArray.count)")
}
self.myTableView.reloadData()
}
}//END query
感谢您的帮助。我将更改应用于代码。但不幸的是它没有奏效。现在它读取** FIRST **'self.posts.append(post [“postText”] as!String)',然后在加载第一个图像之前停止。我放了它一段时间,以防止它加载很长时间,但只是没有更进一步。 – GuiSoySauce
@GuiSoySauce你确定在第一个循环以外的第二个'对象'循环中调用'dispatch_semaphore_wait'吗? – hennes
@GuiSoySauce嗯,对不起,我没有看到任何理由为什么你的更新的代码将无法正常工作。尽管您还应该确保按照其他答案中的建议在主队列上执行表视图更新。 – hennes