Как инициировать объект, когда контроллер появляется без блокировки пользовательского интерфейса с GCD

В моем приложении мне нужно показать UIImagePickerController при нажатии кнопки. Вот код, который я использовал в методе, вызываемом кнопкой на контроллере, когда он нажимается:

- (IBAction)choosePressed:(id)sender {
    if (!self.pickerController) self.pickerController = [[UIImagePickerController alloc]init];
        self.pickerController.delegate = self;
        self.pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        [self.navigationController presentViewController:self.pickerController animated:YES completion:nil];
}

Проблема в том, что UIImagePickerControllers очень медленно загружаются, поэтому я подумал, что перемещение инициализации сборщика в методе viewDidAppear: анимированный , возможно в другом потоке, было бы хорошим способом закрепить процесс создание/показ сборщика, поэтому я сделал это:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    dispatch_queue_t myQueue = dispatch_queue_create("Picker Queue", NULL);
    dispatch_async(myQueue, ^{
    self.pickerController = [[UIImagePickerController alloc]init];
    self.pickerController.delegate = self;
    });
}

- (IBAction)choosePressed:(id)sender {
    self.pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    [self.navigationController presentViewController:self.pickerController animated:YES completion:nil];
}

При этом pickerController появляется сразу после нажатия кнопки, но когда загружается основной контроллер, пользовательский интерфейс замерзает немного (возможно, из-за инициализации pickerController), но init должен быть выполнен в другом потоке, так как я использовал dispatch_async Механизм не так ли? Есть ли ошибка в моем коде?

Я очень новичок в GCD, поэтому мне чего-то не хватает!

3
nl ja de
Это неправильное использование UIKit для доступа к нему из фонового потока. Возможно, вы можете показать экран «загрузка ...». Лично я бы не стал беспокоиться об этом.
добавлено автор nielsbot, источник
Я добавил его в качестве ответа ...
добавлено автор nielsbot, источник
@nielsbot, пожалуйста, подумайте о том, чтобы повторить, что в ответе или BigLex подумайте о том, чтобы ответить на свой собственный вопрос, чтобы он не оставался в списке без ответа навсегда.
добавлено автор ipmcc, источник
ОК! Вы правы, это неважно, мне просто интересно, удалось ли это оптимизировать, спасибо за ответ!
добавлено автор BigLex, источник

1 ответы

Это неправильное использование UIKit для доступа к нему из фонового потока. Возможно, вы можете показать экран «загрузка ...». Я думаю, что лучшая политика - не беспокоиться об этом.

2
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.