如何阻止QTMovie冻结我的应用程序的用户界面?

时间:2012-02-02 13:38:51

标签: objective-c cocoa quicktime grand-central-dispatch

所以我试图采用可变大小(从几MB到大于GB)QTMovie对象并使用writeToFile:withAttributes:将其导出到磁盘。由于这需要很长时间并锁定UI,我决定使用Grand Central Dispatch将其放在不同的线程上。

据我所知,除非使用writeToFile:withAttributes:仍然锁定应用程序,否则此功能完全正常。它确实导出了文件,但是在完成之前你无法对UI做任何事情。

我已经浏览了所有关于在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 :(得分:0)

所以我一直在尝试在后台线程上写电影,我使用的Apple示例代码与你在那里非常相似,但我发现了一些奇怪的东西。

我开始尝试查看故障的位置,我发现了

[movie detachFromCurrentThread]

实际上是失败的(你可以非常快地检查自己,它会返回一个成功的BOOL。

我无法弄清楚是什么阻止QTKit进行分离,我尝试设置各种属性,没有任何改变,无法分离。它有点奇怪,不分离不会导致任何更多的问题,但无论出于何种原因,它似乎迫使其余的代码继续在主线程上。当它无法分离时它仍然有效,它只是按照你说的做,并冻结用户界面。

进一步的探索给了我一个解决方案,如果你深入了解QuickTime框架,你可以得到这个功能:

 OSErr er = DetachMovieFromCurrentThread([movie quickTimeMovie]);

当QTKit调用失败时,它实际上会为我分离。然后在背景中愉快地写电影,UI不再冻结。

希望这会让你感动。