2014-02-02 3 views
0

Я использую UIViewController (1-й), который отображает список комиксов, в которых пользователь может выбрать комикс для загрузки.
Загрузка осуществляется в другом UIViewController (2-й), который имеет tableView (с пользовательской ячейкой загрузки).UITableviewController без загрузки вида

У меня есть NSMutableArray, объявленный во 2-м viewController со всеми комическими URL-адресами, и это tableView загружается из этого массива.

Проблема заключается в том:
Всякий раз, когда я добавить загружаемый элемент в списке и откройте 2-й viewController, то tableView загружается с самого начала, и все файлы начинают загружать снова.
мне нужен способ, так что я могу добавить файлы из 1-го viewController на второй viewController «s tableView и загрузка должна продолжаться с той же стадии, как они были ранее (и не с самого начала снова)

Ниже приведен код того, как работает мой DownloadCell. Каждая ячейка загружает несколько файлов. Первый метод вызывается, когда создается ячейка.

-(void)startDownload:(NSArray*)comicFiles 
{ 
    allComicFiles=comicFiles; 
    downloadedFiles=[[NSMutableArray alloc] init]; 

    [self removeViews]; 
    [self appendViewsToCell]; 

    [loading startAnimating]; 

    [self downloadFile:0]; 
} 

Теперь второй метод вызывается для асинхронного скачивания файлов.

-(void)downloadFile: (int)index 
{ 
    if(index>=[allComicFiles count]) 
    { 
     [self downloadComplete]; 
     return; 
    } 

    SingleComicFile *comicFile=allComicFiles[index]; 

    NSURL *url=comicFile.URL; 

    NSString *fileName=comicFile.FileName; 

    lblFileName.text=fileName; 

    NSString *applicationDocumentsDir = 
    [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
    NSString *storePath = [applicationDocumentsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"%@",fileName]]; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    if ([fileManager fileExistsAtPath:storePath]){ 
     [self updateDownloadProgress:url]; 

     [self downloadFile:index+1]; 
    } 

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 
    dispatch_async(queue, ^{ 

     NSData *data = [NSData dataWithContentsOfURL:url]; 
     dispatch_sync(dispatch_get_main_queue(), ^{ 

      [data writeToFile:storePath atomically:TRUE]; 
      [self updateDownloadProgress:url]; 

      [self downloadFile:index+1]; 
     }); 
    }); 
} 

tablewviecontroller класс имеет изменяемый массив, который является в основном массив из массивов файлов. Он имеет конструктор, который я вызываю на странице списка комиксов, чтобы заполнить массив.

-(MyDownloadManager *)initFileQueue: (NSMutableArray *)withComicFileQueue 
{ 
    if(_fileArray==nil) 
    { 
     _fileArray= [[NSMutableArray alloc]init]; 
    } 
    _fileArray=withComicFileQueue; 

    return self; 
} 

И я связывании TableView как

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    DownloadCell *cell = [tableView dequeueReusableCellWithIdentifier:nil]; 

    if (cell == nil) { 
     cell = [[DownloadCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 
    NSArray *comicFiles= _fileArray[indexPath.row]; 
    [cell startDownload:comicFiles]; 

    return cell; 
} 
+0

@ C_X: Что касается вашего редактирования: обратные тики для * кода *. Маркировка слов, таких как «контроллер просмотра», «вид таблицы» и т. Д. Как «код», не повышает читаемость (на мой взгляд). –

+0

Я думаю, что это делает миры более ориентируемыми ... –

+0

Правда. Это сделало намеченные слова выделенными. – Ranadhir

ответ

0

Может быть, в вашем случае решение, чтобы сделать shareViewController, что будет инициирована один раз (loadView, viewDidLoad будет вызываться один раз). Также, когда вы закрываете общий диспетчер просмотра загрузки, он не перераспределяется и продолжает загружать выбранный файл. Вы можете реализовать некоторый метод делегата для уведомления о завершении загрузки и так далее. Таким образом, вы получите общий долгоживущий загрузчик.

static DownloadViewController *sharedInstance = nil; 

@implementation DownloadViewController 

+ (id) sharedInstance 
{ 
    static dispatch_once_t once; 
    dispatch_once(&once, ^{ 
     sharedInstance = [DownloadViewController new]; 
    }); 

    return sharedInstance; 
} 
+0

Если я использую 'sharedinstance', я мог бы заполнить массив, в котором есть список файлов. Но мне нужно будет перезагрузить табличное представление, чтобы новые добавленные файлы можно было добавить в очередь загрузки. Разве он не начинает загрузку старых файлов? Опять же, я также хочу отобразить tableviewcontroller при загрузке, так что пользователь может быть уверен, что его файлы загружаются. – Ranadhir

+0

Вы были правы, мне нужно было использовать 'sharedinstance'. Большое спасибо. – Ranadhir

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