Преобразование URL в UIImage. Возможность конвертировать, но не добавлять в массив UIImage - PullRequest
0 голосов
/ 30 апреля 2018

Я создаю приложение, использующее 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» после добавления. Тем не менее, я возвращаю ноль при печати массива изображений, но не ноль для самого изображения. enter image description here

Я чувствую, что это может быть связано с асинхронностью метода, но я также попытался добавить основной поток, и это ничего не изменило. Кроме того, переменная «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()
        }
    }
}

1 Ответ

0 голосов
/ 30 апреля 2018

Вы никогда не инициализируете свой массив, вы только объявляете его.

Изменение:

var uiImages: [UIImage]?

до:

var uiImages = [UIImage]()

Затем измените:

self.uiImages?.append(image)

до:

self.uiImages.append(image)

На заметку, никогда не загружайте удаленные данные, используя Data(contentsOf:). Используйте URLSession и dataTask. Ваш код будет вызывать всевозможные проблемы из-за медленного удаленного доступа к данным в главной очереди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...