我正在尝试通过以下方法解决从Web服务接收大量数据的一般情况:

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

对于小数据,我只使用:
[webData appendData:data];

最后,在:
-(void)connectionDidFinishLoading:(NSURLConnection *)connection

我使用输出流将其写入我的文件。

如果数据量巨大,只有几MB数据,那该怎么办?在这种情况下,最好将connection:didReceiveData:中的数据多次转储到同一文件中。使用NSFileHandle听起来很容易,但是在考虑异步/非阻塞UI的同时进行读写同步并不容易(至少对我而言)。

知道这个案例有什么好的方法吗?
我当时正在考虑使用NSThread,每次都对块大小进行排队。有没有更好/更简便的方法呢?

最佳答案

您知道,我实际上为此做了一个类(非ARC,但仍然可以使用)here

用法示例:

// 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];
    });
}

关于objective-c - 将来自Web服务的大量数据分块写入文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8887326/

10-10 20:47
查看更多