iOS:无法在NSURLSession委托内进行GUI更改

时间:2014-11-05 13:47:32

标签: ios objective-c user-interface nsurlsession

使用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中的标签文本相同。

2 个答案:

答案 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()