2012-02-02 64 views
2

所以我试图采取可变大小(从几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); 

回答

0

所以我一直试图在后台线程做电影的写作也和我使用的样例代码苹果不得不这是非常类似于你在那里,但我发现一些奇怪的东西。

我开始尝试,看看那里的故障是,我发现

[movie detachFromCurrentThread] 

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

我想不出什么停止QTKit做分离,我已经尝试设置各种属性,没有任何改变,分离失败。有点奇怪,不分离不会导致更多的问题,但无论出于何种原因,它似乎强制其余的代码继续进行主线程,当它不能分离时它仍然有效,它只是做你说的和冻结的用户界面。

而且探测给了我一个解决方法,如果你下潜得更深一些,到QuickTime的构架,你可以得到的功能:

OSErr er = DetachMovieFromCurrentThread([movie quickTimeMovie]); 

这实际上确实为我做一个分离,当QTKit调用失败。电影然后愉快地写在背景和UI不再冻结。

希望这会让你感动。

+0

感谢您的帮助。这实际上指向了我正确的方向。显然,' - (Movie)quickTimeMovie'方法不适用于64位应用程序,只适用于32位应用程序。我认为(不知道这一点),' - (BOOL)detachFromCurrentThread'实际上是在使用'DetachMovieFromCurrentThread',这可以解释它失败的原因。为了让它工作,我所要做的就是将应用程序转换为32位而不是64位编译。几乎不理想,但至少它是有效的。 – jcocoa5 2012-02-19 01:45:27