【问题标题】:How to handle NSData and return UIImage (Swift)如何处理 NSData 并返回 UIImage (Swift)
【发布时间】:2016-07-24 20:34:32
【问题描述】:

我正在尝试从后端数据库的 URL 中检索图像并将其转换为图像,并返回带有 UIImageView 的函数。如何处理这段代码中的 NSError,并且仍然返回 UIImageView?

func getImage() -> UIView {

    let imageLink = backendless.userService.currentUser.getProperty("Avatar")

    let URL = NSURL(string: imageLink as! String)

    let data = NSData(contentsOfURL: URL!)

    let image: UIImage!

    image = UIImage(data: data!)

    return UIImageView(image: image!)
}

【问题讨论】:

  • 如果后端调用或 NSData(contentsOfURL) 调用到互联网,那么它们不应该是同步的。您应该编写您的方法以使用图像作为参数来完成闭包。

标签: ios swift nsdata nserror


【解决方案1】:

根据 cmets 更新了我的答案。

如果您要查找的图片不可用,您可以返回占位符图片:

所以你的方法将如下所示:

func getImage() -> UIImage {

    var imageLink = backendless.userService.currentUser.getProperty("Avatar")

    guard let imageUrl = imageLink as? String,
        let URL = NSURL(string: imageUrl),
        let data = NSData(contentsOfURL: URL)
         else {
            return UIImage(named: "placeholder")
    }

    return UIImage(data: data)
}

这是你如何使用它:

func koloda(koloda: KolodaView, viewForCardAtIndex index: UInt) -> UIView {
    return UIImageView(image: getImage())
}

【讨论】:

  • 使用imageView的方法如下:func koloda(koloda: KolodaView, viewForCardAtIndex index: UInt) -> UIView { ]它必须返回一个UIImageView,在这种情况下我将如何实现if let?
  • 应用中的行为应该是什么?当图像不可用时是否应该显示占位符?
  • 理想情况下是占位符。
  • 更新了我的答案。
【解决方案2】:

您可以使用此代码从 URL 下载图像并以 UIImage 的形式返回。希望这会有所帮助:

func downloadImage(url: NSURL) -> UIImage {

        getDataFromUrl(url) { (data, response, error)  in
            dispatch_async(dispatch_get_main_queue()) { () -> Void in
                guard let data = data where error == nil else { return }

                let image:UIImage = UIImage(data: data)!

                return image
            }
        }
    }

更新:这是 getDataFromUrl 函数

func getDataFromUrl(url:NSURL, completion: ((data: NSData?, response: NSURLResponse?, error: NSError? ) -> Void)) {
        NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) in
            completion(data: data, response: response, error: error)
            }.resume()
    }

【讨论】:

  • getDataFromUrl 定义在哪里?
猜你喜欢
  • 2013-11-29
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
相关资源
最近更新 更多