Ios 同时向NSMutableArray写入和读取数据

Ios 同时向NSMutableArray写入和读取数据,ios,objective-c,audio,nsmutablearray,streaming,Ios,Objective C,Audio,Nsmutablearray,Streaming,我正在尝试制作一个渐进式下载音频播放器,可以在播放时存储尽可能多的音频 音频的格式经过流优化m4a 对于这个问题,我想把带有拖缆的音频数据包放到内存中,不要把它保存到任何文件中,以保持速度 由于m4a文件的性质,我无法同时从磁盘写入和读取文件 因此,我从远程源流式传输和解析音频数据包,然后将它们放入一个单例NSMutableArray 当streamer下载音频包时,播放机同时从NSMutableArray读取和播放音频包 平均文件大约有11000个音频包,因此阵列的数量达到11000个

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

音频的格式经过流优化
m4a

对于这个问题,我想把带有拖缆的音频数据包放到内存中,不要把它保存到任何文件中,以保持速度

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

因此,我从远程源流式传输和解析音频数据包,然后将它们放入一个
单例
NSMutableArray

当streamer下载音频包时,播放机同时从
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];
我的问题是在某个时候我会遇到死锁吗?

这是音频流的良好实践吗

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

您也可以同步以锁定NSMutableArray

@synchronized(yourMutableArray) {
   [yourMutableArray stuffMethod];
}

我不确定音频流,但正是因为这个原因,我尽量不从可变对象读取。周期性地,为什么不创建一个不可变的副本来读取和继续写入可变版本呢?您不会因为没有锁定而死锁,但是您很可能会通过从多个线程更新来损坏数组(您没有显示要从何处删除数据,因此我只能假设涉及多个线程)。您可以使用串行调度队列来确保从单个线程执行更新。@Paulw11我没有删除任何数据,当播放机读取完最后一个数据包时,我将删除整个阵列。数据填充到阵列中的拖缆有自己的线程,我计划让读卡器/播放器有自己的线程thread@JoshGafni很好的建议,但这在内存分配和cpu使用方面不是太昂贵吗?如果只在一个位置写入阵列,那么就可以了,尽管你需要考虑流停顿时会发生什么情况——如果“读取器”赶上了“写入器”,当数据到达时,如何阻止读取器并通知它?串行调度队列可能比@同步DeNdNt<代码> @同步()/<代码>阻止数组指针更好吗?当从两个不同的线程同时写入数据和读取数据时会发生什么情况?@Paulw11,串行调度可能更好。(也许)我还是会远离NSMutableArray。