我想调用TableViewData Sources方法,以便在Ui从parse中获得fethched之后查找Ui。有了这个我就可以

func loadImages() {

    var query = PFQuery(className: "TestClass")
    query.orderByDescending("objectId")


    query.findObjectsInBackgroundWithBlock ({(objects:[AnyObject]!, error: NSError!) in
        if(error == nil){

            self.getImageData(objects as [PFObject])

        }
        else{
            println("Error in retrieving \(error)")
        }

    })//findObjectsInBackgroundWithblock - end


}

func getImageData(objects: [PFObject]) {

    for object in objects {

        let thumbNail = object["image"] as PFFile

        println(thumbNail)

        thumbNail.getDataInBackgroundWithBlock({
            (imageData: NSData!, error: NSError!) -> Void in
            if (error == nil) {
              var imageDic = NSMutableArray()
                self.image1 = UIImage(data:imageData)
                //image object implementation
                self.imageResources.append(self.image1!)


                println(self.image1)

                println(self.imageResources.count)


            }
            }, progressBlock: {(percentDone: CInt )-> Void in

        })//getDataInBackgroundWithBlock - end



    }//for - end


   self.tableView.reloadData()

但不能像这样将这些获取的数据填充到tableview
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    println("in table view")
     println(self.imageResources.count)
    return imageResources.count+1;
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell:CustomTableViewCell = tableView.dequeueReusableCellWithIdentifier("customCell") as CustomTableViewCell

    var (title, image) = items[indexPath.row]

   cell.loadItem(title: title, image: image)


    println("message : going upto this line")
    println(self.imageResources.count)


   var (image1) = imageResources[indexPath.row]

    cell.loadItem1(image1: image1)

return cell
}

然后在loaditem上,我试图显示图像,并且我已经编写了自己的数组来填充到图像数组中,但是在填充时我正在获取一个零值,因此无法设置它
非常感谢您的帮助!

最佳答案

您有几个问题,都与并发性有关—您的负载是在后台并行发生的。
第一个问题是在加载过程中将self.image1用作临时变量-此变量可以由多个线程并发访问。为此,应该使用局部变量。
其次,您将从多个线程附加到self.imageResources,但Swift数组不是线程安全的。
第三,在加载完所有数据之后,需要在tableview上调用reload,这现在不会发生,因为在后台操作仍在进行时调用它。
最后,您的getImageData函数在后台队列上执行,您必须在主队列上执行UI操作(例如重新加载表)。
最简单的选择是将get thumbnail loading更改为synchronous calls,这意味着您的缩略图将按顺序加载,并且可能比多个并行任务需要更长的时间,但更易于管理-

func getImageData(objects: [PFObject]) {

    for object in objects {

        let thumbNail = object["image"] as PFFile

        println(thumbNail)

        let imageData? = thumbNail.getData
        if (imageData != nil) {
                let image1 = UIImage(data:imageData!)
                //image object implementation
                self.imageResources.append(image1!)

                println(self.imageResources.count)
       }

    }//for - end

   dispatch_async(dispatch_get_main_queue(), {
       self.tableView.reloadData()
   })
}

一种更复杂的方法是使用一个分派组并保持并行图像加载。为此,您需要保护对共享阵列的访问

10-08 06:07
查看更多