0

I need to download large files from the Internet , and save it to local disk.

At first, i save the data like this:

- (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];
        }
    });
}

As AFNetworking use NSOutputstream to save data to local like this:

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;
        }
    }

What are the advantages to use NSOutputstream than NSFileHandle when writing a file ?

What are the advantages in terms of performance ?

4

1 回答 1

7

有几种不同的技术用于读取和写入文件的内容,几乎所有这些技术都受 iOS 和 OS X 的支持。它们基本上都做同样的事情,但方式略有不同。有些技术要求您按顺序读取和写入文件数据,而其他技术可能允许您跳转并仅对文件的一部分进行操作。一些技术为异步读写提供自动支持,而另一些技术则同步执行,以便您可以更好地控制它们的执行。

从可用技术中进行选择是一个决定您希望对读写过程进行多少控制以及您希望花费多少精力来编写文件管理代码的问题。像 Cocoa 流这样的高级技术限制了您的灵活性,但提供了易于使用的界面。POSIX 和 Grand Central Dispatch (GCD) 等较低级别的技术可为您提供最大的灵活性和功能,但需要您编写更多代码。

异步读写文件

因为文件操作涉及访问磁盘(可能是网络服务器上的磁盘),所以几乎总是首选异步执行这些操作。Cocoa 流和 Grand Central Dispatch (GCD) 等技术旨在始终异步执行,这使您可以专注于读取和写入文件数据,而不必担心代码在哪里执行。

使用流线性处理整个文件

如果您总是从头到尾读取或写入文件的内容,流提供了一个简单的接口来异步执行此操作。流通常用于管理套接字和其他类型的源,其中数据可能随着时间的推移变得可用。但是,您也可以使用流在一个或多个突发中读取或写入整个文件。有两种类型的流可用:

  • 使用 anNSOutputStream将数据顺序写入磁盘。
  • 使用 NSInputStream对象从磁盘顺序读取数据。

请通过Apple Documentaion获取代码说明。

于 2014-11-25T04:07:54.797 回答