我需要从Internet下载大文件,并将其保存到本地磁盘。
首先,我保存这样的数据:
- (void)saveToLocalFile:(NSData *)data withOffset:(unsigned long long)offset{
NSString* localFile = [self tempLocalFile];
dispatch_async(mFileOperationQueue_, ^{
NSFileHandle* fileHandle = [NSFileHandle fileHandleForWritingAtPath:localFile];
if (fileHandle == nil) {
[data writeToFile:localFile atomically:YES];
return;
}
else {
[fileHandle seekToFileOffset:offset];
[fileHandle writeData:data];
[fileHandle closeFile];
}
});
}
由于AFNetworking
使用NSOutputstream
将数据保存到本地,如下所示:
NSUInteger length = [data length];
while (YES) {
NSInteger totalNumberOfBytesWritten = 0;
if ([self.outputStream hasSpaceAvailable]) {
const uint8_t *dataBuffer = (uint8_t *)[data bytes];
NSInteger numberOfBytesWritten = 0;
while (totalNumberOfBytesWritten < (NSInteger)length) {
numberOfBytesWritten = [self.outputStream write:&dataBuffer[(NSUInteger)totalNumberOfBytesWritten] maxLength:(length - (NSUInteger)totalNumberOfBytesWritten)];
if (numberOfBytesWritten == -1) {
break;
}
totalNumberOfBytesWritten += numberOfBytesWritten;
}
break;
}
if (self.outputStream.streamError) {
[self.connection cancel];
[self performSelector:@selector(connection:didFailWithError:) withObject:self.connection withObject:self.outputStream.streamError];
return;
}
}
在编写文件时使用NSOutputstream
而不是NSFileHandle
有什么好处?
在性能方面有哪些优势?
答案 0 :(得分:5)
有几种不同的技术可用于读取和写入文件内容,几乎所有这些技术都受到iOS和OS X的支持。所有这些技术基本上都是相同的,但方式略有不同。某些技术要求您按顺序读取和写入文件数据,而其他技术可能允许您跳转并仅对文件的一部分进行操作。某些技术为异步读写提供自动支持,而其他技术则同步执行,以便您可以更好地控制其执行。
从可用技术中进行选择,需要决定您在阅读和编写过程中需要多少控制权以及您希望花费多少精力编写文件管理代码。像Cocoa流这样的高级技术限制了您的灵活性,但提供了易于使用的界面。 POSIX和Grand Central Dispatch(GCD)等低级技术为您提供最大的灵活性和强大功能,但需要您编写更多代码。
异步读取和写入文件
由于文件操作涉及访问磁盘(可能是网络服务器上的磁盘),因此几乎总是首选执行这些操作。 Cocoa流和Grand Central Dispatch(GCD)等技术设计为始终异步执行,这使您可以专注于读取和写入文件数据,而不必担心代码执行的位置。
使用流线性处理整个文件
如果您始终从头到尾读取或写入文件的内容,则流提供了一个简单的接口,可以异步执行此操作。流通常用于管理套接字和其他类型的源,其中数据可能随着时间的推移而变得可用。但是,您也可以使用流在一个或多个突发中读取或写入整个文件。有两种类型的流可用:
NSOutputStream
将数据顺序写入磁盘。 NSInputStream
对象从磁盘顺序读取数据。请仔细阅读Apple Documentaion以获取代码说明。