使用dispatch_async的TableView单元格显示图像显示“void函数中的意外非空返回值”。问题 [英] TableView Cell show image with dispatch_async shows "unexpected non-void return value in void function" issue

查看:136
本文介绍了使用dispatch_async的TableView单元格显示图像显示“void函数中的意外非空返回值”。问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to show the image in the TableViewCell. There are the codes:

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功能。

But scrolling the TableView is very lag so I change the function and add some dispatch_async feature in it.

它在我的getPic函数中显示了void函数中意外的非空返回值的问题。

It shows the issue "unexpected non-void return value in void function" in my getPic 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
    }

任何人都可以告诉我如何解决它?谢谢!

Anyone can tell me how to fix it? Thanks!

推荐答案

使用异步任务时,无法返回对象的值,正在运行的函数主线程,它不会等待你的异步任务完成。

You can't return a value r an object when using the Asynchronous task, The function which is running on the main thread and it won't wait for your async task to be finish.

让我们用关闭

你的代码应该是这样的:

Your code should be like this:

 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

这篇关于使用dispatch_async的TableView单元格显示图像显示“void函数中的意外非空返回值”。问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆