2012-02-02 85 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