2014-11-24 2 views
1

Я создаю приложение для iPhone, которое загружает значки с помощью NSURLSession & NSURLDownloadTask. В этом случае я хочу загрузить только видимые значки ячеек, когда я прокручиваю таблицу, все ожидающие скачивания загрузки будут отменены (задача загрузки для невидимых ячеек должна быть отменена). Для этого я создал метод terminateAllDownloads().Как отменить ожидающую задачу загрузки с помощью NSURLSession в ios?

// 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]); 
    } 
    } 

ответ

0

Вероятно, вы обратитесь к self в блоке, переданного NSURLSession производя удержания цикла.

+1

Привет, Амин ... Не могли бы вы его прояснить? –

+0

Представьте, что вы храните сеанс в экземпляре. Затем вы запускаете задачу с обработчиком завершения, а обработчик завершения ссылается на 'self': экземпляр сохраняет сеанс, сеанс сохраняет задачу, задача сохраняет экземпляр ... –

Смежные вопросы