2014-11-24 84 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查看代碼說明。