对不起,这有点罗嗦,但我想确保我清楚!;-)
我有一个使用 FFMPEG 流式传输 RTSP 的 iOS 应用程序。我使用 NSOperationQueue 对 FFMPEG 进行了多线程处理,因此除了将图像绘制到屏幕之外,它的大部分工作当然都发生在后台线程中。效果很好!...除了 NSOperationQueue 创建的线程永远不会死的事实!
我在类的 init 方法中初始化队列:
self->opQ = [[NSOperationQueue alloc] init];
[self->opQ setMaxConcurrentOperationCount:1];
我使用块向队列添加方法:
[self->opQ addOperationWithBlock:^{
[self haveConnectedSuccessfullyOperation];
}];
或者
[self->opQ addOperationWithBlock:^{
if (SOME_CONDITION) {
[self performSelectorOnMainThread:@selector(DO_SOME_CRAP) withObject:nil waitUntilDone:NO];
}
}];
后来,当我需要拆掉RTSP流时,除了告诉FFMPEG关闭外,我调用:
[self->opQ cancelAllOperations];
这确实阻止了线程做任何工作,但从未真正破坏它们。下面,您将看到一个根本不做任何事情的线程的屏幕截图。这是我的线程在多次启动/停止 FFMPEG 后的样子。
我似乎记得在 Apple 的文档中读到 NSOperations 和它们运行的线程一旦执行完毕就会被销毁,除非另有说明。情况似乎并非如此。
我是否只需要销毁 NSOperationQueue,然后在需要再次启动 FFMPEG 时重新初始化它(我才意识到我没有尝试过这个)?任何人都知道我需要如何杀死这些额外的线程?
谢谢!