我开始开发一个 iphone 应用程序,我需要一些关于 NSURLSession 以及如何正确管理我的数据的下载和解析的建议。
我刚刚纠正了在 nsurlsession 中下载我的数据的错误,但是关于我很难理解这些异步请求,我认为我的解决方案不是很好......下载错误也出现了 2 个不同的解决方案下载,这让我觉得我忘了做某事......
在我的项目中,我下载了不同的 xml 文件(有时还有一些带有图片的 zip 文件),我需要先解析这些文件以显示它们的信息。这些信息可以快速更改,所以如果我再次加载我的页面,我想再次下载它们。我一直在寻找一种以相同方式管理所有下载的简单方法,这样我就不必重新编写大量代码。
我首先找到了这个项目。
有了这个,我只需要使用该代码来管理下载:
NSString *downloadUrl = @"https://www.url.com";
NSURL *location = [NSURL URLWithString:downloadUrl];
// DownloadManager is my version of the CTSessionOperation of the github project
DownloadManager *operation = [DownloadManager new];
operation.downloadUrl = downloadUrl;
operation.completionAction = ^(NSURL *xmlUrl, BOOL success){
dispatch_async(dispatch_get_main_queue(), ^{
if (success){
regions = [[TeamChoiceManager sharedManager] parseRegions:[NSData dataWithContentsOfURL:location]];
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:Nil waitUntilDone:YES];
}
});
};
operation.isBackground = YES;
[operation enqueueOperation];
这段代码在我第一次下载时完美运行。但是如果我尝试再次启动下载,则不会启动下载(所以没有错误,只是,此代码下载一次,仅此而已)。
我通过修改/(NSURLSession *)session
中的方法来纠正这个错误。我在评论中添加了“dispatch_once”以使其正常工作,但我认为这不是一个好的解决方案......CTSessionOperation
DownloadManager
我尝试了另一种导致相同错误的解决方案。我使用以下代码管理下载:
NSString *regionsUrl= @"url";
NSURLSessionConfiguration *sessionConfig =
[NSURLSessionConfiguration defaultSessionConfiguration];
// My solution to the bug
/*NSURLSessionConfiguration *backgroundConfiguration = [NSURLSessionConfiguration
backgroundSessionConfiguration:[NSString stringWithFormat:@"com.captech.mysupersession.BackgroundSession%d",numBGSession]]; */
// numBGSession++; this is a static NSInteger
NSURLSession *session =
[NSURLSession sessionWithConfiguration:backgroundConfiguration
delegate:teamChoiceDetailViewController
delegateQueue:nil];
NSURLSessionDownloadTask *sessDLTask =
[session downloadTaskWithURL:[NSURL URLWithString:regionsUrl]];
[sessDLTask resume];
在委托中:
-(void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
dispatch_async(dispatch_get_main_queue(), ^{
self.regions = [[TeamChoiceManager sharedManager] parseRegions:[NSData dataWithContentsOfURL:location]];
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:Nil waitUntilDone:YES];
});
}
NSURLSessionConfiguration
使用此解决方案,我每次尝试下载时都通过创建自定义来避免错误。
所以我们开始吧。我对这两种解决方案感到很困惑。我不知道它们是否是管理下载的正确方法,我认为我没有正确纠正错误,而且我一定错过了NSURLSession
.
您对改进这些解决方案有什么建议,或者您认为其中一个比另一个好得多?