使用NSURLSession委托时,我的iOS应用程序中的某些GUI组件出现问题。
我有一个UITableViewController,它向用户显示不同的地图区域。用户可以选择其中一个区域,我将推送一个新的UIViewController,显示有关该区域的一些细节。在UIViewController内,用户可以单击按钮下载此地图区域。
我使用NSURLSession下载地图。我有自己的方法来设置会话。
- (NSURLSession *)backgroundSession {
static NSURLSession *session = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.example.app"];
sessionConfiguration.HTTPMaximumConnectionsPerHost = 2;
session = [NSURLSession sessionWithConfiguration:sessionConfiguration
delegate:self
delegateQueue:nil];
});
return session;
}
我开始下载
self.downloadTask = [self.session downloadTaskWithURL:[NSURL URLWithString:hikingMap.downloadSource]];
[downloadTask resume];
这在我从UITableViewController打开的第一个区域非常好用。
示例:
1. Go to area A
2. Start downloading area A
但是,当我先查看某些区域然后再转到另一个区域并尝试下载此区域时,我的问题就出现了。
示例:
1. Go to area A
2. Go back to UITableViewController
3. Go to area B
4. Start downloading area B
实际下载运行得很好。但是,一旦下载开始,我会对GUI进行一些更改。我隐藏了一些标签并显示了一些UIProgressViews。
我在下载进度的委托方法中进行了这些更改:
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
dispatch_async(dispatch_get_main_queue(), ^{
self.label.hidden = YES;
self.progressView.hidden = NO;
});
}
这些隐藏的更改未反映在我的GUI中。基本上我在委托方法之外对GUI进行的所有更改都可以正常工作,但我在委托方法中所做的任何更改都不起作用。
我不明白如何解决这个问题。所以任何帮助都会很棒!告诉我是否需要为您添加更多代码以了解正在发生的事情。
我现在已经确认委托方法使用了对UIlabel的旧引用。我在打开区域A时通过更改标签文本进行测试,然后当我转到区域B并进行下载时,我看到委托方法中的标签文本与区域A中的标签文本相同。
答案 0 :(得分:0)
您的-(NSURLSession *)backgroundSession
方法不安全。第二次调用它时,session
变量设置为nil并且没有正确初始化。试试这个修复
static NSURLSession *_sharedSession;
- (NSURLSession *)backgroundSession
{
if (!_sharedSession)
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.example.app"];
sessionConfiguration.HTTPMaximumConnectionsPerHost = 2;
sharedSession = [NSURLSession sessionWithConfiguration:sessionConfiguration
delegate:self
delegateQueue:nil];
});
}
return _sharedSession;
}
答案 1 :(得分:0)
上传时遇到同样的问题。
要克服它,您必须使共享会话无效并取消(NSURLSession
)。在Swift中,您可以按如下方式执行此操作:
session.invalidateAndCancel()