我一直在努力讓我的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