如何在ios中使用NSURLSession取消挂起的下载任务?

时间:2014-11-24 11:21:36

标签: ios objective-c iphone nsurlsession

我正在创建一个iPhone应用程序,使用NSURLSession& amp; NSURLDownloadTask。 在这种情况下,我想只下载可见的单元格图标,当我滚动表所有挂起的downloadTask取消(即必须取消非可见单元格的下载任务)。为此,我创建了一个方法terminateAllDownloads()。

// terminateAllDownloadTask 

-(void)terminateAllDownloads
{
    NSArray *allDownloads = [self.iconDownloadInProgress allValues];
    [allDownloads makeObjectsPerformSelector:@selector(cancelDownload)];

     [self.iconDownloadInProgress removeAllObjects];
}

// cancelDownload
-(void)cancelDownload
{

[self.downloadTask cancel];
[self.session invalidateAndCancel];

}

并在dealloc&中调用此函数didRecieveMemoryWarning方法的MasterViewController.m

// dealloc
-(void)dealloc
{
   [self terminateAllDownloads];
}

// didReceiveMemeoryWarning
- (void)didReceiveMemoryWarning
{
  [super didReceiveMemoryWarning];
  [self terminateAllDownloads];
}

但这种方法不是单次调用的。我该怎么做?

我正在使用NSURLSession委托,而不是完成块

//code 
-(void)startDownload
{
    appDelgate = [[UIApplication sharedApplication] delegate];
    self.fileName = self.appData.name;
    self.iconURL = self.appData.iconURL;
    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration   defaultSessionConfiguration];
    sessionConfig.allowsCellularAccess = NO;
    _session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
     self.downloadTask = [_session downloadTaskWithURL:[NSURL URLWithString:_iconURL]];

     [_downloadTask resume];
 }

 -(void)cancelDownload
 {
    [self.downloadTask cancel];
    [self.session invalidateAndCancel];
 }

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
 {
     NSString *trimmedString = [_fileName stringByReplacingOccurrencesOfString:@" " withString:@""];

     NSString *appIconDirectory = [[documentsDirectoryForAppIcons absoluteString] stringByAppendingPathComponent:@"appIcons"];
     NSURL* destinationUrlForAppIcon = [[NSURL URLWithString:appIconDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@%@",trimmedString, @".png"]];

     NSError *error1;

     if([appIconFileManager fileExistsAtPath:[destinationUrlForAppIcon absoluteString]])
    {
       [appIconFileManager removeItemAtPath:[destinationUrlForAppIcon absoluteString] error:NULL];
    }

    BOOL status = [appIconFileManager copyItemAtURL:location toURL:destinationUrlForAppIcon error:&error1];
   if (status && !error1)
   {

     [appDelgate.downloadedIcons setValue:destinationUrlForAppIcon.path forKey:self.iconURL];

       if(self.completionHandler)
       {
          self.completionHandler(destinationUrlForAppIcon);
       }
    }
    else
    {
       NSLog(@"File copy failed: %@", [error1 localizedDescription]);
    }
  }

1 个答案:

答案 0 :(得分:0)

您可能会在传递给self的块中引用NSURLSession,从而产生保留周期。