Как сократить время загрузки MPMediaPickerController?
В моем проекте я использую MPMediaPickerController, чтобы выбрать файл из музыкальной библиотеки устройства. Я использую следующий фрагмент кода для отображения медиа-выбора.
MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];
mediaPicker.delegate = self;
mediaPicker.prompt = @"Select a personal message";
[self presentViewController:mediaPicker animated:NO completion:nil];
Все работает нормально, но MediaPickerController занимает пару секунд (от 2 до 3 секунд) для отображения музыкальной библиотеки. Есть ли способ уменьшить это время загрузки MPMediaPickerController. Эта задержка после нажатия кнопки загрузки действительно плохая для пользователя.
3 ответа
Я заметил, что мой MediaPickerController также был очень медленным (в моем текущем проекте, использующем Swift 2.2), даже несмотря на то, что раньше он был довольно быстрым в проекте (и большая часть того, что я добавил с тех пор, была сетевым кодом).
В своем коде я создавал экземпляр MPMediaPickerController только тогда, когда пользователь нажимал кнопку "Найти песню". Создав экземпляр MPMediaPickerController во время загрузки основного представления (я поместил его в своем объявлении класса, вне viewDidLoad), я (каким-то образом) смог уменьшить время загрузки до менее секунды (тогда как иногда даже не появился, когда я создал экземпляр MPMediaPickerController в последнюю возможную секунду).
TLDR: напиши это:
import UIKit
import MediaPlayer
import MobileCoreServices
class SomeViewController: UIViewController, MPMediaPickerControllerDelegate {
var mediaPickerController = MPMediaPickerController(mediaTypes: .AnyAudio)
func viewDidLoad() {
mediaPickerController.delegate = self
mediaPickerController.prompt = "Select a song that you like"
}
@IBAction func buttonWasTapped(sender: AnyObject) {
self.presentViewController(mediaPickerController, animated: true, completion: nil)
}
}
Вместо этого: (обратите внимание, как я создаю экземпляр mediaPickerController только после нажатия моей кнопки.
import UIKit
import MediaPlayer
import MobileCoreServices
class SomeViewController: UIViewController, MPMediaPickerControllerDelegate {
func viewDidLoad() {
}
@IBAction func buttonWasTapped(sender: AnyObject) {
var mediaPickerController = MPMediaPickerController(mediaTypes: .AnyAudio)
mediaPickerController.delegate = self
mediaPickerController.prompt = "Select a song that you like"
self.presentViewController(mediaPickerController, animated: true, completion: nil)
}
}
Ничего не поделать. Если есть много музыки, требуется время, чтобы рассмотреть все это и подготовить контроллер, и это все, что нужно сделать. Это ничем не отличается от задержки при первом использовании пользователем приложения "Музыка". Вы можете уменьшить количество отображаемого материала, отключив showsCloudItems
, но даже это может не помочь.
Лучшее, что вы можете сделать, это, вероятно, попытаться покрыть задержку психологически, то есть дать пользователю что-то, что можно увидеть, например, индикатор вращающейся активности, пока все не будет на месте. Однако я не пробовал это с MPMediaPickerController (я сделал это с помощью собственного собственного интерфейса исследования музыкальной библиотеки, который имеет те же проблемы с задержкой).
Как предположил Мэтт, индикатор активности вращения действительно может помочь пользователю, поскольку он убеждает пользователя в том, что он работает и не потерпел крах. Для этого я использовал MBProgressHUD при загрузке трека из музыкальной библиотеки.