使用 NSURLSession 异步下载数据和处理

Posted

技术标签:

【中文标题】使用 NSURLSession 异步下载数据和处理【英文标题】:Downloading data and processing asynchronous with NSURLSession 【发布时间】:2013-12-27 10:08:12 【问题描述】:

我正在使用 NSURLSession 下载 xml 文件,然后我想对这些文件进行不同的处理,比如解析它们:

-(void)parseFeed:(NSURL *)url

    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];

    NSURLSessionDataTask* task = [FeedSessionManager.sharedManager.session dataTaskWithRequest:request completionHandler:^(NSData* data, NSURLResponse* response, NSError* error)
                                  
                                      Parser* parser = [[Parser alloc] initWithData:data];

                                      [self.feeds addObjectsFromArray:[parser items]];

                                  ];

    [task resume];

Parser 对象将使用NSXMLParser 解析xml 文件。 parseFeed:(NSURL*)url 是从 ViewController 调用的:

Downloader* downloader = [[Downloader alloc] init];
[downloader parseFeed:[NSURL URLWithString:@"http://www.engadget.com/tag/features/rss.xml"]];
NSArray* items = [downloader feeds];

这就是我创建NSURLSession 对象的方式:

-(id)init

    if(self = [super init])
    
        _session = [NSURLSession sessionWithConfiguration:FeedSessionConfiguration.defaultSessionConfiguration delegate:self delegateQueue:nil];
    

    return self;

当然,这种方法对我不起作用。在parseFeed 方法中,我想等到所有数据都下载并处理完毕。只有这样我才想访问ViewController 中的self.feeds 数组。

有人可以指出我这样做的正确方向吗?或者也许给我指出一种不同的方法?

【问题讨论】:

为什么不使用操作队列进行下载,在从代表处获得下载完整响应后,您可以开始解析它们,最好的事情是您可以控制下载,如优先级、暂停和取消 @Retro:感谢您的建议,您能否提供一个这样做的示例? 【参考方案1】:

我用过ASIHTTPRequest但现在不再维护但你可以使用AFHTTPClient的操作队列

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:nil];

// Important if only downloading one file at a time
[client.operationQueue setMaxConcurrentOperationCount: 1];

NSArray *videoURLs; // An array of strings you want to download

for (NSString * videoURL in videoURLs) 

    // …setup your requests as before

    [client enqueueHTTPRequestOperation:downloadRequest];

【讨论】:

以上是关于使用 NSURLSession 异步下载数据和处理的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession 未下载完整数据,但成功完成

NSURLSession 下载任务 - 进度条问题

NSURLSession 后台任务:避免重复

应用重启后监控 NSURLSession

使用 NSURLSession 如何在取消下载任务时获取接收到的数据或临时文件位置

swift3.0:NSURLSession的使用