Я создаю приложение, использующее swift, которое вызывает API Google Places для создания файла местоположений в формате JSON, включая изображения сгенерированного местоположения. Эти изображения представлены в виде URL-адресов, которые мне нужно преобразовать в UIImage, а затем добавить эти изображения в массив. При открытии содержимого 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» после добавления. Тем не менее, я возвращаю ноль при печати массива изображений, но не ноль для самого изображения.
Я чувствую, что это может быть связано с асинхронностью метода, но я также попытался добавить основной поток, и это ничего не изменило. Кроме того, переменная «photos» не равна nil, она устанавливается при создании экземпляра контроллера представления.
Вот код для класса Фото:
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
}
}
EDIT:
Вот как выглядел мой класс 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()
}
}
}