На данный момент я получил свой основной просмотр таблицы с ячейками, которые загружаются из XML и заполняются.После этого я могу щелкнуть одну ячейку и загрузить подробный вид (файл xib, загруженный с помощью кода в основном виде таблицы).В подробном окне я могу нажать кнопку загрузки, и некоторые файлы загружаются асинхронно в папку документов.Затем я открываю представление и снова вижу свое табличное представление.
Моя идея теперь состоит в том, чтобы видеть ход загрузки в ячейке табличного представления.Я настроил uiprogressview для каждой ячейки, который по умолчанию скрыт.Теперь я хочу видеть индикатор выполнения при запуске загрузки.Как я могу это сделать?
Я пробовал что-то с executeSelectorOnMainThread и селектором, которые изменяют прогресс моей выбранной ячейки (которую я назначаю в главном табличном представлении).Кажется, это плохая идея - не сработало.
Некоторые идеи, как это сделать?
РЕДАКТИРОВАТЬ 2: Часть кода моего решения, ВНИМАНИЕ!Это не настоящий код, я удалил много строк для вставки сюда.Есть не все выпуски и т.д. Я думаю, что решение действительно грязное, но я не нашел лучшего решения для меня ...
Некоторые важные вещи:
- cellDownloading: Массив, который знаеткаждая ячейка, которая в данный момент загружает
- progressDictionary: знает ход каждой ячейки
- cellDictionary: знает каждую ячейку, заполненную делегатом cellForRowAtIndexpath представления таблицы
Я также не могу скопировать весь код, потому что есть много вещей, которые не имеют ничего общего со всем процессом, но я даю вам важные шаги.Мои ячейки создаются путем анализа xml, поэтому у каждой ячейки есть setId в моем случае.
////////////////// // Downloader.mm //////////////////
метод загрузки asynchron
-(void)startAsynchronousDownload:(NSString*)path{
// generate notification
NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init];
NSNumber *tmpSetId = [NSNumber numberWithInteger:setId];
[userInfo setObject:tmpSetId forKey:@"setId"];
NSNotification* notification = [NSNotification notificationWithName:@"downloadStackNotification" object:self userInfo:userInfo];
[[NSNotificationCenter defaultCenter] postNotification:notification];
// add some infos...
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setObject:tmpSetId forKey:@"setId"];
// perhaps more here
// asynchronous download handling
NSOperationQueue *queue = [NSOperationQueue alloc] init];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImagesWithDictionary:) object:dictionary];
// release
[operation release];
[dictionary release];
[userInfo release];
}
В моем примере селектор downloadImagesWithDictionary загружает несколько изображений для каждого загруженного изображенияЯ отправляю уведомление.В моем случае каждый стек изображений имеет setId.
[...]
NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init];
NSNumber *sliceCounter = [NSNumber numberWithInt:i];
NSNumber *amount = [NSNumber numberWithInt:amountOfImages];
NSNumber *tmpSetId = [NSNumber numberWithInteger:setId];
[userInfo setObject:sliceCounter forKey:@"actualImage"];
[userInfo setObject:amount forKey:@"allImages"];
[userInfo setObject:tmpSetId forKey:@"setId"];
NSNotification* notification = [NSNotification notificationWithName:@"downloadSliceNotification" object:self userInfo:userInfo];
[[NSNotificationCenter defaultCenter] postNotification:notification ];
[...]
////////////////////////////// //TableViewController.mm ////////////////////////////
Теперь нам нужно получить уведомления для обновления таблицы
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(downloadSliceNotification:) name:@"downloadSliceNotification" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(downloadStackNotification:) name:@"downloadStackNotification" object:nil];
Нам нужен словарь ячеек, чтобы знать весь путь индекса существующих ячеек таблицы.Заполните их в cellForRowAtIndexPath делегата
[cellDictionary setObject:indexPath forKey:[NSString stringWithFormat:@"%d",cellSetId]];
Теперь мы создаем обработчик для выполнения чего-то, если мы получаем уведомление. Сначала обработчик, если загрузка начинается, у меня есть словарь прогресса, который знает каждый прогресс каждой ячейки, который я могуидентифицируйте каждую ячейку по setId - возможно, вам придется немного это изменить
- (void)downloadStackNotification:(NSNotification*)notification {
NSDictionary *userInfo = [notification userInfo];
NSNumber *setId = [userInfo objectForKey:@"setId"];
NSNumber *progress = [NSNumber numberWithInt:0];
[progressDictionary setObject:progress forKey:[setId stringValue]];
// add cell to downloadlist
[cellDownloading addObject:[setId stringValue]];
}
Теперь для каждого шага загрузки (в моем случае одно изображение).Рассчитайте процесс и обновите словарь, получите ячейку для обновления прогресса
- (void)downloadSliceNotification:(NSNotification*)notification {
NSDictionary *userInfo = [notification userInfo];
NSNumber *sliceCounter = [userInfo objectForKey:@"actualImage"];
NSNumber *amount = [userInfo objectForKey:@"allImages"];
NSNumber *setId = [userInfo objectForKey:@"setId"];
NSNumber *progress = [NSNumber numberWithFloat:(100/[amount floatValue])*[sliceCounter floatValue]];
[progressDictionary setObject:progress forKey:[setId stringValue]];
NSIndexPath* indexPath = [cellDictionary objectForKey:[setId stringValue]];
CustomServerCell* cell = (CustomServerCell*)[self.tableView cellForRowAtIndexPath:indexPath];
NSMutableDictionary *downloadData = [[NSMutableDictionary alloc] init];
[downloadData setObject:cell forKey:@"cell"];
[downloadData setObject:sliceCounter forKey:@"actualImage"];
[downloadData setObject:amount forKey:@"allImages"];
[self performSelectorOnMainThread:@selector(updateProgressWithDictionary:) withObject:downloadData waitUntilDone:NO];
}
Обновите ячейку
-(void)updateProgressWithDictionary:(NSMutableDictionary*)downloadData {
CustomServerCell* cell = (CustomServerCell*)[downloadData objectForKey:@"cell"];
NSNumber *sliceCounter = [downloadData objectForKey:@"actualImage"];
NSNumber *amount = [downloadData objectForKey:@"allImages"];
cell.progressView.hidden = FALSE;
NSNumber *tmpProgress = [progressDictionary objectForKey:[NSString stringWithFormat:@"%d",cell.progressView.tag]];
cell.progressView.progress = [tmpProgress floatValue]/100;
cell.statusLabel.text = [NSString stringWithFormat:@"download slice %d / %d",[sliceCounter integerValue],[amount integerValue]];
}