大家好,请教大家个问题: 服务器传输图片时,socket: didReadData: withTag:会调用多次,输出截图如下: |
|
5分 |
接收到的数据直接写入文件不就可以了吗?
|
10分 |
其实你就是想把多个NSData拼接起来吧。
你懒加载一个NSMutableData,然后把接受到的每一个NSData 添加进去: - (NSMutableData *)data { if (_data == nil) { _data = [NSMutableData new]; } return _data; } [self.data appendData:data] 这样的话,是把所有的Data都放在内存里了,如果你的文件会比较大,就像楼上说的,接收一点就写入一点,不用在内存中占用太多空间。 |
10分 |
didReadData是分段读取的数据。所以正如楼上的做法,先确保你接收到了服务器传递过来的是完整的NSData流,才能保证写入文件时的成功。 NSData 有实例方法 writeToFile:options:error 可以将数据流写入到指定路径的文件,提前是你要知道你接收到的是什么类型的流(图像,文字,音频)。
|
我们socket是用来传大量图片和视频的。
writeToFile: atomically:,但是这个方法好像是一次写入。 如果使用多个NSData写入到一个文件里面的话,应该要使用数组。因为每次NSData是从socket获取的,如果使用数组保存NSData,如果文件太大,使用数组一次写入,内存占用会很大。有没有方法读一点NSData,就写入一点? 我们socket是用来传大量图片和视频的,请教下,比较好的方法写入文件是什么? |
|
25分 |
writeToFile: atomically:确实是一次性写入的,你可以采用这种读一点、就写一点的方法: NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:aPath]; [fileHandle seekToEndOfFile]; [fileHandle writeData:[textToWrite dataUsingEncoding:NSUTF8StringEncoding]]; [fileHandle closeFile]; |
谢谢版主!我使用NSFileHandle完成了图片的下载,图片的MD5值也是正确的。 |