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。