具有 dispatch_async 的 TableView 单元格显示图像显示 "unexpected non-void return value in void function" 问题

TableView Cell show image with dispatch_async shows "unexpected non-void return value in void function" issue

我想在 TableViewCell 中显示图像。有代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cellIdentifier = "myCell"
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! DIYSquareALLCell
        cell.titles!.text = titles[indexPath.row]
        cell.leftImages!.image = getPic(leftImages[indexPath.row])
        return cell
    }

func getPic(PicURL: String) -> UIImage! {
        let image = self.imageCache[PicURL] as UIImage?
        if image == nil {
            let url = NSURL(string: PicURL.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!)
            if let data = NSData(contentsOfURL: url!) {
                imageCache[PicURL] = UIImage(data: data)
                return UIImage(data: data)!
            }
        } else {
            return image
        }
        return nil
    }

但是滚动 TableView 非常滞后,所以我更改了函数并在其中添加了一些 dispatch_async 功能。

它显示了我的 getPic 函数中的问题 "unexpected non-void return value in void function"。

我修改后有代码:

func getPic(PicURL: String) -> UIImage! {
        let image = self.imageCache[PicURL] as UIImage?
        if image == nil {
            let url = NSURL(string: PicURL.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!)
            let priority = DISPATCH_QUEUE_PRIORITY_HIGH
            dispatch_async(dispatch_get_global_queue(priority, 0)) {
                let data = NSData(contentsOfURL: url!)
                if data != nil {
                    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                        self.imageCache[PicURL] = UIImage(data: data!)
                        return UIImage(data: data!)// here is the issue
                    })
                }
            }
        } else {
            return image
        }
        return nil
    }

谁能告诉我怎么解决?谢谢!

当使用异步任务时你不能return一个对象的值,这个函数在主线程上运行并且它不会等待你的异步任务完成。

让我们用 Closure 来做到这一点。

你的代码应该是这样的:

 typealias CompletionHandler = (image: UIImage) -> Void
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: testCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! testCell
        downloadFileFromURL(NSURL(string: "http://img.youtube.com/vi/PCwL3-hkKrg/sddefault.jpg")!, completionHandler:{(img) in
             dispatch_async(dispatch_get_main_queue(), { () -> Void in
                cell.imgView.image = img
             })

            })
        return cell
    }

    func downloadFileFromURL(url1: NSURL?,completionHandler: CompletionHandler) {
        // download code.
        if let url = url1{
        let priority = DISPATCH_QUEUE_PRIORITY_HIGH
        dispatch_async(dispatch_get_global_queue(priority, 0)) {
            let data = NSData(contentsOfURL: url)
            if data != nil {
                print("image downloaded")
                completionHandler(image: UIImage(data: data!)!)
            }
            }
        }
    }

示例项目已上传至 GIT