Так что я пытаюсь взять объект QTMovie с переменным размером (от нескольких МБ до более ГБ) и использовать writeToFile:withAttributes:
для экспорта на диск. Поскольку это занимает много времени и блокирует пользовательский интерфейс, я решил поместить его в другой поток, используя Grand Central Dispatch.Как остановить QTMovie от замораживания пользовательского интерфейса моего приложения?
Насколько я могу судить, это работает отлично, за исключением того, что 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);
Спасибо за помощь. Это фактически указывало мне в правильном направлении. По-видимому, метод '- (Movie) quickTimeMovie' недоступен для 64-битных приложений, только 32-разрядных приложений. Я думаю (не уверен в этом), что '- (BOOL) detachFromCurrentThread' фактически использует' DetachMovieFromCurrentThread' в его реализации, что объясняет, почему он терпит неудачу. Чтобы заставить его работать, все, что мне нужно было сделать, это конвертировать приложение для компиляции как 32-битное, а не 64-битное. Вряд ли идеальный, но по крайней мере он работает. – jcocoa5