Моя проблема: У меня есть основания полагать, что инициализация 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
?