Как я могу остановить QTMovie от заморозки пользовательского интерфейса моего приложения? - PullRequest
2 голосов
/ 02 февраля 2012

Поэтому я пытаюсь взять объект QTMovie переменного размера (от нескольких МБ до более чем ГБ) и использовать writeToFile:withAttributes: для экспорта его на диск.Так как это занимает много времени и блокирует пользовательский интерфейс, я решил поместить его в другой поток с помощью Grand Central Dispatch.

Насколько я могу судить, это прекрасно работает, кроме использования writeToFile:withAttributes:блокирует приложение.Он экспортирует файл, но вы ничего не можете сделать с пользовательским интерфейсом, пока не закончите.

Я просмотрел все документы по использованию нескольких потоков с QTKit и различных мест в Google, но, похоже, ничего из того, что я пробовал, не работает.

Ниже приведен код, который, кажется, имеет проблемы:

[movie detachFromCurrentThread];

dispatch_queue_t combineQueue = dispatch_queue_create("com.Combinate.movieCombineQueue", NULL);

dispatch_async(combineQueue, ^{

    [QTMovie enterQTKitOnThreadDisablingThreadSafetyProtection];
    [movie attachToCurrentThread];
    [movie writeToFile:filepath withAttributes:exportAttributes];

    [movie detachFromCurrentThread];
    [QTMovie exitQTKitOnThread];

    dispatch_async(dispatch_get_main_queue(), ^{
        [movie attachToCurrentThread];
        [self finishedCombiningAudioFiles:(QTMovie *)movie];
    });

});

dispatch_release(combineQueue);

1 Ответ

0 голосов
/ 16 февраля 2012

Так что я тоже пытался писать фильмы в фоновом потоке, и я использовал пример кода, который был у Apple, который очень похож на ваш, но я нашел что-то странное.

Я начал пытаться увидеть, где произошла поломка, и обнаружил, что

[movie detachFromCurrentThread]

действительно провалился (вы можете проверить себя очень быстро, он возвращает BOOL успеха.

Я не могу понять, что мешает QTKit выполнить отсоединение, я попытался установить различные атрибуты, и ничто не меняет эту ошибку при отсоединении. Немного странно, что отсоединение не вызывает больше проблем, но по какой-то причине кажется, что остальная часть кода продолжает работать в основном потоке. Он все еще работает, когда не удается отсоединиться, он просто делает то, что вы говорите, и замораживает пользовательский интерфейс.

Дальнейшее исследование дало мне исправление: если вы немного углубитесь в рамки QuickTime, вы можете получить функцию:

 OSErr er = DetachMovieFromCurrentThread([movie quickTimeMovie]);

, который на самом деле делает отсоединение для меня при сбое вызова QTKit. Фильм тогда счастливо написан на заднем плане, и пользовательский интерфейс больше не зависает.

Надеюсь, это поможет вам.

...