所以我试图采取可变大小(从几MB到超过GB的任何地方)QTMovie对象,并使用writeToFile:withAttributes:
将其导出到磁盘。由于这需要很长时间并锁定用户界面,因此我决定使用Grand Central Dispatch将其置于不同的线程中。如何阻止QTMovie冻结我的应用程序的UI?
据我所知,这工作得很好,除了使用writeToFile:withAttributes:
仍然锁定应用程序。它会导出文件,但在用户界面完成之前您无法对其执行任何操作。
我已经浏览了使用QTKit的多个线程以及谷歌上的各种地方的所有文档,但没有任何我尝试过似乎工作。
下面是一个似乎有麻烦的代码:
[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 2012-02-19 01:45:27