Как сократить время загрузки 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 при загрузке трека из музыкальной библиотеки.

Другие вопросы по тегам