我正在使用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。
我觉得这可能与方法的异步有关,但我也尝试在主线程上附加,这并没有改变任何东西。此外,"照片"变量不是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()
}
}
}
答案 0 :(得分:3)
你永远不会初始化你的数组,你只需要声明它。
变化:
var uiImages: [UIImage]?
为:
var uiImages = [UIImage]()
然后改变:
self.uiImages?.append(image)
为:
self.uiImages.append(image)
另外,请勿使用Data(contentsOf:)
加载远程数据。使用URLSession
和dataTask
。由于主队列上的远程数据访问速度慢,您的代码将导致各种问题。