Objective c 如何阻止QTMONIVE冻结我的应用程序的UI?

Objective c 如何阻止QTMONIVE冻结我的应用程序的UI?,objective-c,cocoa,quicktime,grand-central-dispatch,Objective C,Cocoa,Quicktime,Grand Central Dispatch,因此,我尝试获取一个可变大小(从几MB到超过GB)的QTMovie对象,并使用writeFile:withAttributes:将其导出到磁盘。由于这需要很长时间并锁定UI,我决定使用Grand Central Dispatch将其放在不同的线程上 据我所知,除了使用writeToFile:withAttributes:仍会锁定应用程序外,这一切都很好。它确实会导出文件,但在完成之前,您无法对UI执行任何操作 我已经浏览了所有关于使用QTKit多线程的文档,以及Google上的各个地方,但我尝试

因此,我尝试获取一个可变大小(从几MB到超过GB)的QTMovie对象,并使用
writeFile: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);

所以我也一直在尝试在后台线程上写电影,我使用了苹果公司的示例代码,它与你的非常相似,但我发现了一些奇怪的东西

我开始试着看看故障在哪里,我发现了

[movie detachFromCurrentThread]
实际上是失败了(你可以很快地检查自己,它会返回一个成功的BOOL

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

进一步的探索为我提供了一个解决方案,如果您深入研究QuickTime框架,您可以获得以下功能:

 OSErr er = DetachMovieFromCurrentThread([movie quickTimeMovie]);
当QTKit调用失败时,它实际上为我做了一个分离。然后在后台愉快地编写电影,UI不再冻结


希望这能让你有所进展。

所以我也一直在尝试在背景线程上写电影,我使用了苹果公司的示例代码,与你的非常相似,但我发现了一些奇怪的东西

我开始试着看看故障在哪里,我发现了

[movie detachFromCurrentThread]
实际上是失败了(你可以很快地检查自己,它会返回一个成功的BOOL

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

进一步的探索为我提供了一个解决方案,如果您深入研究QuickTime框架,您可以获得以下功能:

 OSErr er = DetachMovieFromCurrentThread([movie quickTimeMovie]);
当QTKit调用失败时,它实际上为我做了一个分离。然后在后台愉快地编写电影,UI不再冻结


希望这能让你有所进展。

谢谢你的帮助。这实际上为我指明了正确的方向。显然,
-(Movie)quickTimeMovie
方法不适用于64位应用程序,只适用于32位应用程序。我想(对此不确定)这
-(BOOL)detachFromCurrentThread
实际上在它的实现中使用了
DetachMovieFromCurrentThread
,这就解释了它失败的原因。为了让它正常工作,我所要做的就是将应用程序转换为32位而不是64位。虽然不太理想,但至少它能正常工作。谢谢你的帮助。这实际上为我指明了正确的方向显然,
-(Movie)quickTimeMovie
方法不适用于64位应用程序,仅适用于32位应用程序。我认为(对此不确定)
-(BOOL)detachFromCurrentThread
实际上在它的实现中使用了
DetachMovieFromCurrentThread
,这就解释了它失败的原因。为了让它工作,我所要做的就是将应用程序转换为32位而不是64位。虽然不太理想,但至少它可以工作。