gpt4 book ai didi

objective-c - 如何阻止 QTMovie 卡住我的应用程序的 UI?

转载 作者:行者123 更新时间:2023-12-03 16:47:34 28 4
gpt4 key购买 nike

因此,我尝试采用可变大小(从几 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);

最佳答案

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

我开始尝试查看故障所在,结果发现

[movie detachFromCurrentThread]

实际上失败了(你可以很快地检查一下自己,它会返回成功 BOOL。

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

进一步的探索给了我一个修复,如果你更深入地研究 QuickTime 框架,你可以获得这个函数:

 OSErr er = DetachMovieFromCurrentThread([movie quickTimeMovie]);

当 QTKit 调用失败时,它实际上会为我执行分离操作。然后,电影会在后台愉快地写入,UI 不再卡住。

希望这能让您的事情有所进展。

关于objective-c - 如何阻止 QTMovie 卡住我的应用程序的 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9113316/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com