Objective c 将多个NSData写入文件

Objective c 将多个NSData写入文件,objective-c,cocoa,Objective C,Cocoa,我需要一个关于如何将多个NSData块写入单个文件的提示。分块使用NSURLConnection下载文件。每个区块都下载到单独的NSOperation线程中。当区块完成下载时,需要将其写入一个文件中,这样组合的结果就是下载的文件 管理返回的NSData并将其写入单个文件的最佳方法是什么假设你知道最终的数据大小是什么,并且你想坚持基础类/ Objtovi-C,你可以创建一个NSMutable数据的实例,这些实例可以在这些操作中共享。当一个操作完成其区块时,它应该锁定一些共享互斥体,将完成的下载写入

我需要一个关于如何将多个NSData块写入单个文件的提示。分块使用NSURLConnection下载文件。每个区块都下载到单独的NSOperation线程中。当区块完成下载时,需要将其写入一个文件中,这样组合的结果就是下载的文件


管理返回的NSData并将其写入单个文件的最佳方法是什么
加入所有操作后,您可以使用NSData类上的writeToFile:便利方法将可变数据写入文件。如果您更精通C/BSD,还可以将文件创建为mmap并简单地写入。由于所有数据都将在映射中以离散的秒数显示,因此可以在不锁定互斥锁的情况下进行写入。一旦所有的操作都被连接起来,你就可以移除MMAP并关闭文件。

< P>假设你知道最终的数据大小是什么,并且你想坚持基础类/ Objtovi-C,你可以创建一个NSMutable数据的实例,这些实例可以在这些操作中共享。当一个操作完成其区块时,它应该锁定一些共享互斥体,将完成的下载写入NSMutableData对象中的适当位置,然后解锁共享互斥体


加入所有操作后,您可以使用NSData类上的writeToFile:便利方法将可变数据写入文件。如果您更精通C/BSD,还可以将文件创建为mmap并简单地写入。由于所有数据都将在映射中以离散的秒数显示,因此可以在不锁定互斥锁的情况下进行写入。加入所有操作后,可以删除mmap并关闭文件。

将每个块写入单独的文件。然后,在下载最后一个区块时,按正确的顺序将每个文件连接到一个大文件中

将每个块写入一个单独的文件。然后,在下载最后一个区块时,按正确的顺序将每个文件连接到一个大文件中

无需通过创建大型NSMutableData对象来消耗内存(由于内存不足,大规模下载是不可能的),也无需浪费时间创建大量小文件并将其浓缩(使用大型文件可能需要很长时间,iDevice磁盘IO速度不是很快)

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

NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
[handle seekToEndOfFile];
[handle writeData:dataPiece];
[handle closeFile];
不过,您需要首先创建该文件,以便可以使用NSFileHandle打开它。要做到这一点,您只需使用以下命令编写第一个NSData片段,然后使用文件句柄编写其余的NSData片段

[dataPiece writeToFile:filePath atomically:YES];


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

无需通过创建大型NSMutableData对象来消耗内存(大型下载无论如何都不可能,因为您可能会耗尽内存),也无需浪费时间创建大量小文件并将其浓缩(大文件可能需要很长时间,iDevice磁盘IO速度不是很快)

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

NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
[handle seekToEndOfFile];
[handle writeData:dataPiece];
[handle closeFile];
不过,您需要首先创建文件,以便可以使用NSFileHandle打开它

[dataPiece writeToFile:filePath atomically:YES];


编辑:事实上,我刚刚重读了这个问题,意识到你正在使用不同的线程来下载块,因此它们可能无法按顺序完成,所以我的解决方案不会起作用。我回答的那天一定很累,跳过了它。但是,希望我的回答至少可以帮助按顺序或单线程下载块的其他人

@Martin Gordon的可能副本:我不认为这是一个副本。它的措辞可能让我不理解,但我觉得他正在下载其他线程上的离散块,然后必须重新创建文件。如果这是真的,在它们进入时附加块将不起作用,因为文件的顺序不正确正如Jason Cocoa所说,文件的每个块(任意大小)都在一个单独的线程中下载(因此,在写入文件时,调度可能是一个问题)。所有数据都需要合并到一个文件中。但由于该文件的大小可能超过100MB,因此必须写入数据,而不是将其保存在内存中。可能重复的@Martin Gordon:我认为这不是重复的。它的措辞可能使我不理解,但我觉得他正在下载光盘在其他线程上删除块,然后必须重新创建文件。如果是这样,则在出现块时追加块将不起作用,因为文件顺序不正确(因为任何块都可能在任何其他块之前完成)。正如Jason Coco所说,文件的每个块(任意大小)都在单独的线程中下载(因此,在写入文件时,调度可能是一个问题)。所有数据都需要合并到一个文件中。但由于该文件的大小可能超过100MB,因此必须写入数据,而不是将其保存在内存中。C/BSD方法可能是一种方法,但我正在寻找客观C的答案。您给出的答案将起作用,但我关心的是文件si