Objective c 将大量数据从web服务分块写入文件

Objective c 将大量数据从web服务分块写入文件,objective-c,ios,cocoa-touch,web-services,nsurlconnection,Objective C,Ios,Cocoa Touch,Web Services,Nsurlconnection,我试图通过以下方式解决从web服务接收大量数据的一般情况: -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 对于小数据,我只使用: [webData appendData:data]; 最后,在: -(void)connectionDidFinishLoading:(NSURLConnection *)connection 我使用输出流将其写入我的文件 当数据量巨大时,几兆字节的数据

我试图通过以下方式解决从web服务接收大量数据的一般情况:

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
对于小数据,我只使用:

[webData appendData:data];
最后,在:

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
我使用输出流将其写入我的文件

当数据量巨大时,几兆字节的数据会怎么样?在这种情况下,最好将
connection:didReceiveData:
中的数据多次转储到同一个文件中。使用
NSFileHandle
听起来很简单,但是在考虑异步/非阻塞UI的同时同步读写并不简单(至少对我来说)

你知道什么是解决这个问题的好方法吗?
我正在考虑使用
NSThread
,每次都将块大小排队。有什么更好/更简单的方法吗?

首先,几兆比特并不重要。用同样的方法做几次MBs绝对没问题。但如果您确实希望在接收数据时写入文件,则可以使用
NSFileHandle
。创建一个,然后向其中写入数据,然后在需要将数据刷新到磁盘时调用该文件上的
synchronizeFile
。你可以在说每10MB写一次什么东西后调用
synchronizeFile
(显然最后也是这样)

例如:

NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:filename];
...
[fileHandle writeData:dataComeInFromURLConnection];
...
[fileHandle synchronizeFile];

你知道,我之前确实为这个做了一个类(非ARC,但它仍然可以工作)

用法示例:

// in init
RJRStreamWriter myWriter = [[RJRStreamWriter alloc] initWithLocalFile:@"path/to/my/file" andAppend:NO];

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    static dispatch_queue_t asyncQueue;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
           asyncQueue = dispatch_queue_create("asyncQueue", NULL);
    });

    dispatch_async(asyncQueue, ^{
        // this method is optimized, and aggregates NSOutputStream, NSMutableData, and NSFileHandle
        [myWriter writeData:data];
    });
}

我的错,我的意思是,像300MB,你的代码处理这个大文件吗?是的,300MB就可以了。Richard似乎也有一些代码,所以要么继续使用他的类,要么像我一样使用自己的类,只使用
NSFileHandle
@Kamran很抱歉,我不小心忘了包含与库一起使用的文件,请尝试重新下载并告诉我它是否有效…谢谢Richard,为了能够编译您的第一个代码,我必须添加您今天发给我的类似代码。再次感谢。Richard,你能为我提供上传案例的建议吗?我修改了一点相同的代码,以便能够上传一个文件。现在,让上传过程异步的好方法是什么?谢谢@Kamran此类此时不支持上载文件。您需要创建一个套接字或http post到您的服务器。