首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >后台线程上的AVAudioPlayer

后台线程上的AVAudioPlayer
EN

Stack Overflow用户
提问于 2017-06-22 16:11:46
回答 1查看 1.9K关注 0票数 3

我对使用后台线程知之甚少,但这似乎以我需要的方式播放我的声音,如下所示:

1)即使声音重叠,我也需要这个很短的声音效果来反复播放。2)我需要把声音很好地按时播放。3)我需要加载声音不影响屏幕上的图形口吃。

我目前只是尝试这个方法与一个声音,但如果成功,我将推出它的其他声音效果,需要同样的治疗。我的问题是:我是否正确地使用后台线程?会有任何内存泄漏吗?

下面是代码:

代码语言:javascript
运行
复制
-(void) playAudio {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSString *path = [NSString stringWithFormat:@"%@/metronome.mp3", [[NSBundle mainBundle] resourcePath]];
        NSURL *metronomeSound = [NSURL fileURLWithPath:path];
        _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:metronomeSound error:nil];
        [_audioPlayer prepareToPlay];
        [_audioPlayer play];
    });
}

//handles collision detection
-(void) didBeginContact:(SKPhysicsContact *)contact {
    uint32_t categoryA = contact.bodyA.categoryBitMask;
    uint32_t categoryB = contact.bodyB.categoryBitMask;

    if (categoryA == kLineCategory || categoryB == kLineCategory) {
        NSLog(@"line contact");
        [self playAudio];
    }
}
EN

Stack Overflow用户

发布于 2017-06-22 17:13:43

据我所知,我使用AVAudioPlayer并在后台线程中异步使用它,没有任何问题,也没有泄漏。但是,我已经实现了一个单例类,它处理所有分配,并保留一个AVAudioPlayer实例数组,这些实例也在需要时异步播放。如果需要重复播放声音,则应该为每次播放声音时分配一个AVAudioPlayer实例。在这种情况下,延迟是可以忽略不计的,你甚至可以同时播放相同的声音。

关于你的策略,我认为需要一些改进,特别是如果你想防止任何延误。主要问题总是从磁盘读取,这是最慢的操作和限制步骤。

因此,我还将实现一个AVAudioPlayers数组,每个数组已经初始化,以播放特定的声音,特别是如果这个声音经常重复播放的话。如果内存开始增长,则可以从数组中删除那些播放频率较低的玩家实例,并在几秒钟前重新加载它们,如果您能够判断需要哪些实例的话。

还有一件事。不要忘记锁定和解锁数组,如果您要从多个线程或更好地访问它,请创建一个GCD队列来处理对数组的所有访问。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44704573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档