将URL转换为UIImage。能够转换但不附加到UIImage数组

时间:2018-04-30 17:17:55

标签: ios swift url asynchronous uiimage

我正在使用swift创建一个应用程序来调用Google Places api来生成位置的JSON文件,包括生成位置的图像。这些图像是作为我需要转换为UIImage然后将这些图像附加到数组的URL给出的。打开URL的内容时,我能够看到图像,但这些图像不会附加到数组中。这是我的视图控制器类正在尝试生成所述图像:

import Foundation
import UIKit
import WebKit

class ImageViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    var photos: [Photo]?
    var uiImages: [UIImage]?

    override func viewDidLoad() {

        for photo in photos! {

            let url = URL(string:"https://maps.googleapis.com/maps/api/place/photo?photoreference=\(photo.reference)&sensor=false&maxheight=\(photo.height)&maxwidth=\(photo.width)&key=AIzaSyC_SoYT7VnYnyz3GAb7qqbXjZeLFG5GE70")

            let data = try? Data(contentsOf: url!)

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

            self.uiImages?.append(image)

            print(image)

            print(self.uiImages)

        }
    }
}

在这个循环中,我告诉代码打印"图像"然后阵列" uiImages"发生追加后。然而,我在打印图像数组时返回nil,但对于图像本身则不是nil。 enter image description here

我觉得这可能与方法的异步有关,但我也尝试在主线程上附加,这并没有改变任何东西。此外,"照片"变量不是nil,它是在实例化视图控制器时设置的。

以下是Photo类的代码:

import Foundation

struct Photo {

    var height: Int
    var width: Int
    var reference: String

    init?(height: Int, width: Int, reference: String) {
        self.height = height
        self.width = width
        self.reference = reference
    }
}

编辑:

在进行建议的更改后,我的ImageViewController类就是这样:

import Foundation
import UIKit
import WebKit

class ImageViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    var photos: [Photo]?
    var uiImages = [UIImage]()

    override func viewDidLoad() {

        for photo in photos! {

            let url = URL(string:"https://maps.googleapis.com/maps/api/place/photo?photoreference=\(photo.reference)&sensor=false&maxheight=\(photo.height)&maxwidth=\(photo.width)&key=AIzaSyC_SoYT7VnYnyz3GAb7qqbXjZeLFG5GE70")

            let task = URLSession.shared.dataTask(with: url!) {(data, response, error) in

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

                self.uiImages.append(image)

                print(image)

                print(self.uiImages)
            }

            task.resume()
        }
    }
}

1 个答案:

答案 0 :(得分:3)

你永远不会初始化你的数组,你只需要声明它。

变化:

var uiImages: [UIImage]?

为:

var uiImages = [UIImage]()

然后改变:

self.uiImages?.append(image)

为:

self.uiImages.append(image)

另外,请勿使用Data(contentsOf:)加载远程数据。使用URLSessiondataTask。由于主队列上的远程数据访问速度慢,您的代码将导致各种问题。