同时向 NSMutableArray 写入和读取数据

Posted

技术标签:

【中文标题】同时向 NSMutableArray 写入和读取数据【英文标题】:Writing and Reading Data to an NSMutableArray at the same time 【发布时间】:2015-05-18 19:22:46 【问题描述】:

我正在尝试制作一个渐进式下载音频播放器,它将在播放时存储尽可能多的音频。

音频的格式是流优化m4a

对于这个问题,我认为将带有流媒体的音频数据包放入内存中,不要将其保存到任何文件中以保持速度更快。

而且由于 m4a 文件的性质,我无法同时从磁盘写入和读取文件...

所以我从远程源流式传输并解析音频包,然后将它们放入SingletonNSMutableArray...

当流媒体下载音频包时,播放器同时读取和播放来自NSMutableArray的音频包...

平均文件有大约 11000 个音频包,因此数组的计数达到 11000。

    NSMutableDictionary * myDict = [[NSMutableDictionary alloc] init];
    NSData *inputData = [NSData dataWithBytes:inInputData length:inPacketDescriptions[i].mDataByteSize];
    [myDict setObject:inputData forKey:@"inInputData"];


    NSNumber *numberBytes = [NSNumber numberWithInt:inNumberBytes];
    [myDict setObject:numberBytes forKey:@"inNumberBytes"];

    NSNumber *numberPackets = [NSNumber numberWithInt:inNumberPackets];
    [myDict setObject:numberPackets  forKey:@"inNumberPackets"];


    NSNumber *mStartOffset = [NSNumber numberWithInt:inPacketDescriptions[i].mStartOffset];
    NSNumber *mDataByteSize = [NSNumber numberWithInt:inPacketDescriptions[i].mDataByteSize];
    NSNumber *mVariableFramesInPacket = [NSNumber numberWithInt:inPacketDescriptions[i].mVariableFramesInPacket];

    [myDict setObject:mStartOffset forKey:@"mStartOffset"];
    [myDict setObject:mDataByteSize forKey:@"mDataByteSize"];
    [myDict setObject:mVariableFramesInPacket forKey:@"mVariableFramesInPacket"];

    [sharedCache.baseAudioCache addObject:myDict];

我的问题是在某些时候我会遇到死锁吗? 这是音频流的好习惯吗?

【问题讨论】:

我不确定音频流,但出于这个原因,我尽量不要从可变对象中读取。为什么不定期创建一个不可变副本来读取并继续写入可变版本? 你不会死锁,因为你没有锁定 - 但你可能会通过从多个线程更新数组来破坏数组(你没有显示删除数据的位置,所以我可以仅假设涉及多个线程)。您可以使用串行调度队列来确保从单个线程执行更新。 @Paulw11 我没有删除任何数据,当播放器完成读取最后一个数据包时,我将删除整个数组。数据填充到数组中的 Streamer 有自己的线程,我打算让阅读器/播放器有自己的线程 @JoshGafni 很好的建议,但在内存分配和 CPU 使用方面不会太昂贵? 如果你只在一个地方写入数组,那么你就可以了,虽然你需要考虑如果流停止会发生什么 - 如果“阅读器”赶上“作者”,如何当更多数据到达时,您会阻止阅读器并通知它吗? 【参考方案1】:

我真的建议在您构建 NSMutableArray 之后使用 NSArrays。

您也可以同步锁定 NSMutableArray。

@synchronized(yourMutableArray) 
   [yourMutableArray stuffMethod];

【讨论】:

串行调度队列可能比@synchronised 更好 不会@synchronized() 阻止数组指针吗?当从两个不同的线程同时写入和读取数据时会发生什么? @Paulw11,串行调度可能会更好。 (也许 dispatch_barrier_async() )我仍然会远离 NSMutableArrays。

以上是关于同时向 NSMutableArray 写入和读取数据的主要内容,如果未能解决你的问题,请参考以下文章

文件和流

SQL Server - 创建只能从数据库读取数据和向数据库写入数据的用户

向 NSMutablearray 添加了一个对象并发布

如何在 CoreBluetooth 上同时向多个蓝牙 LE 从站写入数据?

ByteBuffer

使用可序列化而不是向/从文件写入和读取对象