【问题标题】:Cancel Downloadtask pending取消下载任务挂起
【发布时间】:2017-10-22 21:47:34
【问题描述】:

我有两个视图控制器 控制器 A 和控制器 B

在控制器 A 中,我有一个按钮来显示视图控制器 B。

在控制器 B 中,我有一个按钮下载(从下面的代码开始下载)和一个后退按钮(关闭视图控制器 B 以返回 A)

现在我希望每当我从控制器 B 回到控制器 A,然后再次从控制器 A 回到控制器 B 时,所有挂起的下载任务都被取消。

我尝试添加代码,在视图中确实加载了

[dataTask suspend];
[dataTask cancel];

但除此之外,当前正在运行的下载字节被接收

  - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data

我正在使用下面的代码下载多个文件

@property (nonatomic, retain) NSMutableData *dataToDownload;
@property (nonatomic) float downloadSize;
@property (nonatomic, retain)NSURLSessionDownloadTask *dataTask;
- (void)viewDidLoad {
    [super viewDidLoad];

for(int i=0;i<[urlarray count];i++)
{
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];

    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];

    NSURL *url = [NSURL URLWithString: [urlarray objectAtIndex:i]];
    dataTask = [defaultSession downloadTaskWithURL: url];

    [dataTask resume];
}
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {
    completionHandler(NSURLSessionResponseAllow);

    progressBar.progress=0.0f;
    _downloadSize=[response expectedContentLength];
    _dataToDownload=[[NSMutableData alloc]init];
}

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
    [_dataToDownload appendData:data];
    progressBar.progress=[ _dataToDownload length ]/_downloadSize;
}

【问题讨论】:

  • 那么问题出在哪里?
  • 我想停止后台下载......然后想用它开始新的下载......
  • 试试[NSURLSession cancelPreviousPerformRequestsWithTarget:self];

标签: ios xcode nsurlsessiondownloadtask nsurlsessiontask


【解决方案1】:

所以在我的记忆中,我取消了如下下载任务。

    NSURLSession *session = [SingletonManager sharedInstance].downloadSession;

    [session
        getTasksWithCompletionHandler:^(
            NSArray<NSURLSessionDataTask *> *_Nonnull dataTasks,
            NSArray<NSURLSessionUploadTask *> *_Nonnull uploadTasks,
            NSArray<NSURLSessionDownloadTask *> *_Nonnull downloadTasks) {

          for (NSURLSessionTask *task in downloadTasks) {
              [task cancel];
              [session invalidateAndCancel];
              NSLog(@"Download session %@ will be invalidate and cancel",
                    session);
             [SingletonManager sharedInstance].downloadSession = nil;
          }
        }];

[会话无效和取消];

意味着现在让这个会话无效并取消,然后

[会话完成TasksAndInvalidate]

意思是等到这个任务完成后才取消所有的任务。

【讨论】:

  • 我应该把它放在 viewdidload 中吗?以及为什么我的 [session invalidateAndCancel];不工作?
  • 您可以随时随地调用此函数,不仅是 viewDidLoad,而且我在上面找不到您的 [session invalidateAndCancel] 代码。
  • 仍然显示后端正在进行的数据下载和收到的给字节...
  • 您是否将会话设置为 nil?试试这个。
  • 仅供参考,您将在 viewDidLoad 中创建的会话与用于下载的会话不同。您应该使用相同的会话来取消或暂停。这就是为什么我将这个会话保持为单例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多