将多个NSData写入文件

时间:2010-04-27 14:29:54

标签: objective-c cocoa

我需要提示如何将多个NSData块写入单个文件。使用NSURLConnection以块的形式下载文件。每个块都在一个单独的NSOperation线程中下载。当块完成下载时,需要将它们写入文件,因此组合结果是下载的文件。

管理返回的NSData并将其写入单个文件的最佳方法是什么?

3 个答案:

答案 0 :(得分:10)

不需要通过创建一个大的NSMutableData对象来占用内存(因为内存不足而无法进行大量下载),也不需要浪费时间创建大量的小文件并对它们进行仲裁(可能需要很长一段时间用大文件,iDevice磁盘IO不是很快)。

只需创建一个NSFileHandle并使用它将每个NSData对象写入文件的末尾。

NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
[handle seekToEndOfFile];
[handle writeData:dataPiece];
[handle closeFile];

您需要首先创建文件,以便可以使用NSFileHandle打开它。为此,您可以使用以下内容编写第一个NSData片段,然后使用文件句柄编写其余部分。

[dataPiece writeToFile:filePath atomically:YES];

编辑:实际上我只是重新阅读了这个问题,并意识到你正在使用单独的线程来下载这些块,这样它们可能无法按顺序完成,所以我的解决方案无效。我回答的那天一定很累,然后就跳过了。但是,希望我的回答至少可以帮助那些按顺序或单线程下载块的其他人。

答案 1 :(得分:1)

假设您知道最终数据大小是什么,并且您希望坚持使用Foundation classes / Objective-C,您可以创建一个可以跨这些操作共享的NSMutableData实例。当一个操作完成它的块时,它应该锁定一些共享的互斥锁,将完成的下载写入NSMutableData对象中的适当位置,然后解锁共享的互斥锁。

一旦所有操作都加入,您就可以使用NSData类上的writeToFile:convenience方法将可变数据写入文件。如果你更擅长C / BSD,你也可以将文件创建为mmap并简单地写入它。由于映射中的所有数据都是离散的秒数,因此您可以在不锁定互斥锁的情况下进行写入。一旦所有操作都加入,您就可以删除mmap并关闭文件。

答案 2 :(得分:1)

将每个块写入单独的文件。然后,当下载最后一个块时,将每个文件以正确的顺序连接成一个大文件。