Как определить, когда панель быстрого просмотра закрыта? - PullRequest
0 голосов
/ 16 сентября 2018

Я написал плагин Quick Look, который пытается воспроизводить музыку следующим образом:

OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options)
{
    NSURL *fileURL = (__bridge NSURL*)url;

    AudioPlayer *player = // load player with fileURL

    // Create a semaphore
    sema = dispatch_semaphore_create(0);
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);

    // Start playback and signal the semaphore once finished
    [player play:^{
        dispatch_semaphore_signal(sema);
    }];

    // Wait here until the player completion block signals the semaphore to stop waiting
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    NSLog(@"%@", @"done!");

    return kQLReturnNoError;
}

По разным причинам для меня не практично транскодировать эти аудиофайлы в формат, который знает macOS, илииначе я мог бы просто передать ОС файл MP3 и получить плагин системы для его воспроизведения.Поэтому вместо этого я использую грязный хак с семафорами, чтобы остановить выполнение, чтобы сохранить объект моего проигрывателя, иначе он внезапно остановился бы сразу после начала воспроизведения.

Проблема в том, что файл просто продолжитсяВоспроизведение после того, как панель «Быстрый просмотр» прекращает его предварительный просмотр из-за все еще запущенного процесса quicklookd.

Есть ли способ остановить воспроизведение, как это делают системные плагины, когда они закрываются?

1 Ответ

0 голосов
/ 16 сентября 2018

Вы пытались использовать следующие методы делегата:

Согласно документации Apple:

func previewControllerWillDismiss (QLPreviewController) Вызывается до закрытия контроллера предварительного просмотра,func previewControllerDidDismiss (QLPreviewController) Вызывается после закрытия контроллера предварительного просмотра.

...