使用GCDAsyncSocket从服务器下载文件,怎么拼接NSData数据成为一个文件?

iOS 码拜 10年前 (2015-05-02) 1400次浏览 0个评论

大家好,请教大家个问题:
    使用GCDAsyncSocket从服务器下载文件,怎么拼接NSData数据成为一个文件?
    具体情况是这样的——
    向服务器发送下载图片命令,然后会回调下面的函数:
    -(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSLog(@”接收到的数据为:%@”, data);
    
    //接收数据后还要执行接收方法
    [self.socket readDataWithTimeout:-1 tag:APKSokcetReadTag];
}

    服务器传输图片时,socket: didReadData: withTag:会调用多次,输出截图如下:
使用GCDAsyncSocket从服务器下载文件,怎么拼接NSData数据成为一个文件?
    怎么把接收到的NSData数据拼接成一个文件?请大家指点下,谢谢了!

使用GCDAsyncSocket从服务器下载文件,怎么拼接NSData数据成为一个文件?
5分
接收到的数据直接写入文件不就可以了吗?
使用GCDAsyncSocket从服务器下载文件,怎么拼接NSData数据成为一个文件?
10分
其实你就是想把多个NSData拼接起来吧。
你懒加载一个NSMutableData,然后把接受到的每一个NSData 添加进去:

- (NSMutableData *)data {
    if (_data == nil) {
        _data = [NSMutableData new];
    }
    return _data;
}
[self.data appendData:data]

这样的话,是把所有的Data都放在内存里了,如果你的文件会比较大,就像楼上说的,接收一点就写入一点,不用在内存中占用太多空间。

使用GCDAsyncSocket从服务器下载文件,怎么拼接NSData数据成为一个文件?
10分
didReadData是分段读取的数据。所以正如楼上的做法,先确保你接收到了服务器传递过来的是完整的NSData流,才能保证写入文件时的成功。 NSData 有实例方法  writeToFile:options:error 可以将数据流写入到指定路径的文件,提前是你要知道你接收到的是什么类型的流(图像,文字,音频)。
使用GCDAsyncSocket从服务器下载文件,怎么拼接NSData数据成为一个文件?
    我们socket是用来传大量图片和视频的。
    writeToFile: atomically:,但是这个方法好像是一次写入。
    如果使用多个NSData写入到一个文件里面的话,应该要使用数组。因为每次NSData是从socket获取的,如果使用数组保存NSData,如果文件太大,使用数组一次写入,内存占用会很大。有没有方法读一点NSData,就写入一点?
    我们socket是用来传大量图片和视频的,请教下,比较好的方法写入文件是什么?
使用GCDAsyncSocket从服务器下载文件,怎么拼接NSData数据成为一个文件?
25分
引用 4 楼 Little_Virus 的回复:

    我们socket是用来传大量图片和视频的。
    writeToFile: atomically:,但是这个方法好像是一次写入。
    如果使用多个NSData写入到一个文件里面的话,应该要使用数组。因为每次NSData是从socket获取的,如果使用数组保存NSData,如果文件太大,使用数组一次写入,内存占用会很大。有没有方法读一点NSData,就写入一点?
    我们socket是用来传大量图片和视频的,请教下,比较好的方法写入文件是什么?

writeToFile: atomically:确实是一次性写入的,你可以采用这种读一点、就写一点的方法:

NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:aPath];
[fileHandle seekToEndOfFile];
[fileHandle writeData:[textToWrite dataUsingEncoding:NSUTF8StringEncoding]];
[fileHandle closeFile];
使用GCDAsyncSocket从服务器下载文件,怎么拼接NSData数据成为一个文件?
引用 5 楼 zhangao0086 的回复:
Quote: 引用 4 楼 Little_Virus 的回复:

    我们socket是用来传大量图片和视频的。
    writeToFile: atomically:,但是这个方法好像是一次写入。
    如果使用多个NSData写入到一个文件里面的话,应该要使用数组。因为每次NSData是从socket获取的,如果使用数组保存NSData,如果文件太大,使用数组一次写入,内存占用会很大。有没有方法读一点NSData,就写入一点?
    我们socket是用来传大量图片和视频的,请教下,比较好的方法写入文件是什么?

writeToFile: atomically:确实是一次性写入的,你可以采用这种读一点、就写一点的方法:

NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:aPath];
[fileHandle seekToEndOfFile];
[fileHandle writeData:[textToWrite dataUsingEncoding:NSUTF8StringEncoding]];
[fileHandle closeFile];

谢谢版主!我使用NSFileHandle完成了图片的下载,图片的MD5值也是正确的。
    


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明使用GCDAsyncSocket从服务器下载文件,怎么拼接NSData数据成为一个文件?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!