2014-11-24 82 views
0

我需要从Internet下载大文件,并将其保存到本地磁盘。使用NSOutputstream有什么优势?

起初,我保存的数据是这样的:

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

有什么用NSOutputstreamNSFileHandle时的优势写一个文件?

在性能方面有什么优势?

+0

你使用NSFileHandle增量保存数据吗? Ifso .. thats thats在这种情况下输出流的主要点 – 2014-11-24 13:25:28

+0

其实,我想知道什么是在性能方面的优势? – foogry 2014-11-25 02:19:44

+0

我尝试了你的两个方法,他们的工作和我的单元测试通过,但是当我在Finder中打开实际文件时,它总是空的。你有什么想法? – 2016-12-14 03:40:04

回答

4

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

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

读取和写入文件异步

由于文件操作包括访问磁盘(可能的一个网络服务器上),异步地执行这些操作几乎总是优选的。诸如Cocoa流和Grand Central Dispatch(GCD)等技术设计为在任何时候都是异步执行的,这使您可以专注于读取和写入文件数据,而不用担心代码执行的位置。

处理线性使用流

如果你总是读取或写入启动文件的内容到结束,流提供这样做异步一个简单的界面整个文件。流通常用于管理数据可能随时间变得可用的套接字和其他类型的数据源。但是,您也可以使用流以一个或多个突发读取或写入整个文件。有两种类型的可用流:

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

请通过Apple Documentaion查看代码说明。