AFHTTPRequestOperation восстанавливает индикатор выполнения при закрытии и повторном открытии просмотра?

В настоящее время я застрял в проблеме с моим приложением и в том, как я могу восстановить активный UIProgressView в UICollectionViewCell после того, как пользователь выйдет из контроллера представления, нажав «Назад», а затем вернувшись в него.

AFHTTPRequestOperation все еще работает в фоновом режиме, загружая файл, когда пользователь выходит из представления, однако по возвращении это выглядит так, как будто загрузка не происходит, и UIProgressView возвращается к 0.

Это код, который я запускаю после нажатия кнопки «Загрузить» в ячейке «Коллекция», которая работает нормально, но только на время жизни представления.

 [operation1 setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
        NSLog(@"Progress = %f", (float)totalBytesRead / totalBytesExpectedToRead );
        float progressValue = (float)totalBytesRead / totalBytesExpectedToRead;
        [cell.downloadProgress setProgress:progressValue];

    }];

    [operation1 start];

Любые советы о том, как я могу восстановить это состояние загрузки/прогресс в представлении коллекции при ее перезагрузке?

Спасибо, Аарон.


person MonkeyBlue    schedule 14.01.2014    source источник


Ответы (1)


Это, вероятно, также не работает, если вы прокручиваете вниз и создаете резервную копию своего представления коллекции. Проблема в том, что cell указывает на правильную ячейку только до тех пор, пока она не будет прокручена за пределы экрана (она может быть повторно использована для другого контента или может быть nil позже).

Операция должна сообщать контроллеру о ходе выполнения, а не ячейке.

Одна из возможных реализаций может выглядеть так:

__weak typeof(operation1)weakOperation = operation1;
[operation1 setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
    __strong __typeof(weakOperation)strongOperation = weakOperation;
    NSLog(@"Progress = %f", (float)totalBytesRead / totalBytesExpectedToRead );
    float progressValue = (float)totalBytesRead / totalBytesExpectedToRead;
    [self updateProgress:progressValue forOperation:strongOperation];
}];

[operation1 start];

И метод в вашем контроллере может выглядеть так:

- (void) updateProgress:(float)progress forOperation:(AFHTTPRequestOperation *)operation {
    YourCustomCollectionViewCell *cell = // find the correct cell using 'operation', and your data model
    [cell.downloadProgress setProgress:progress];
}
person Aaron Brager    schedule 14.01.2014
comment
Привет, спасибо за ответ, я ссылался на IndexPath, поэтому он появился только один раз при прокрутке, ваше решение выглядит хорошо, и я думал в этом направлении, но не могу понять, как найти правильную продажу с помощью операции? Я сделаю еще немного чтения. Спасибо еще раз - person MonkeyBlue; 15.01.2014
comment
Вы можете сохранить ссылки на все операции в своей модели данных или попытаться выяснить, какая ячейка верна на основе URL-адреса (посмотрите на operation.request). Правильный подход зависит только от того, что вы делаете конкретно. - person Aaron Brager; 15.01.2014
comment
Спасибо, если посмотреть дальше на код, метод updateProgress все еще работает, когда представление закрыто, и ссылается на старый IndexPath, поэтому я думаю, мне нужно выяснить, как передать правильную ячейку/IndexPath, когда представление снова откроется. - person MonkeyBlue; 15.01.2014
comment
Всегда ли путь к индексу один и тот же? Если нет, то от чего это зависит? - person Aaron Brager; 15.01.2014
comment
Да, IndexPath меняет то, что я делаю в качестве базового теста в collectionView cellForItemAtIndexPath, если indexPath.row = 0. Я сохраняю IndexPath в свойстве _downloadingIndexPath = indexPath; и это используется в updateProgress, который отлично работает до тех пор, пока представление не будет закрыто и открыто снова, кажется, что IndexPath изменен, и операция не получает последнее значение _downloadingIndexPath. Спасибо еще раз - person MonkeyBlue; 15.01.2014