Является ли UIImage (data: Data) асинхронным? - PullRequest
0 голосов
/ 28 октября 2019

Моя проблема: У меня есть основания полагать, что инициализация UIImage из Data немного оживляет мой основной поток. Это не страшно, для завершения требуется доля секунды, но это заметно, поскольку мой пользовательский интерфейс выглядит немного странно.

Что я делаю: У меня естьUIPageViewController. Один из UIViewController, представленных указанным UIPageViewController, использует этот инициализатор UIImage(data: Data) в его viewDidLoad методе:

class PageViewController: UIPageViewController {

    var pages: [UIViewController] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        loadPages()
    }

    ...

    func loadPages() {

        let vc1 = storyboard!.instantiateViewController(withIdentifier: "VC1") as! ViewController1
        let vc2 = storyboard!.instantiateViewController(withIdentifier: "VC2") as! ViewController2
        let vc3 = storyboard!.instantiateViewController(withIdentifier: "VC3") as! ViewController3
        pages.append(userProfilePreviewVC)
        pages.append(meetVC)
        pages.append(chatLogVC)

        setViewControllers([pages[1]], direction: UIPageViewController.NavigationDirection.forward, animated: false, completion: nil)
    }
}

extension PageViewController: UIPageViewControllerDelegate, UIPageViewControllerDataSource {
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {

        switch currentIndex {
        case 1:
            return pages[0]
        case 2:
            return pages[1]
        default:
            return nil
        }
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        switch currentIndex {
        case 0:
            return pages[1]
        case 1:
            return pages[2]
        default:
            return nil
        }
    }
}

Вот где проблема заключается:

class ViewController1: UIViewController {

    @IBOutlet var profilePicButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        let userPhotos = UserDefaults.standard.array(forKey: "UserPhotos") as? [Data] ?? []
        if userPhotos.count != 0 {
            self.profilePicButton.setImage(UIImage(data: userPhotos.first ?? Data()) ?? UIImage(named: "profile")!, for: .normal)
        } else {
            self.profilePicButton.setImage(UIImage(named: "profile"), for: .normal)
        }
    }
}

Мой вопрос: При перелистывании моего PageViewController на страницу, которая отображает ViewController1, основной поток, кажется, горит, поскольку для его загрузки требуется доля секунды ViewController1. Это в отличие от других контроллеров представления, которые мгновенно готовы к работе при наведении на них. Точно так же, когда у пользователя нет сохраненных данных изображения профиля, его место занимает изображение заполнителя из моей папки assets.xcassets. Там нет задержки при представлении этого изображения. Мой вопрос: я должен использовать UIImage(data: Data) в фоновом потоке и обновить изображение кнопки после инициализации UIImage?

...