2009-12-01 4 views
27

Хорошо, у меня есть UITableView с пользовательскими UITableViewCell s, каждый из которых содержит UIImageView, изображения которого загружаются асинхронно через NSURLConnection. Все довольно стандартные вещи ...Отложенная визуализация UIImageView в UITableView

Проблема в том, что при прокрутке таблицы новые изображения загружаются в фоновом режиме правильно, но не RENDERED, пока стол не перестанет двигаться.

Как заставить таблицу отображать ее содержимое, даже когда оно перемещается? Спасибо.

- ОБНОВЛЕНИЕ -

После более близкого взгляда, я нахожу, что NSURLConnection делегат методы не стреляя, пока таблица не остановится. Не знаю, почему. Любая помощь будет большой.

ответ

65

Причина, по которой сообщения делегата соединения не срабатывают, пока вы не прекратите прокрутку, потому что во время прокрутки цикл цикла находится в UITrackingRunLoopMode. По умолчанию NSURLConnection расписывает себя только в NSDefaultRunLoopMode, поэтому вы не получаете никаких сообщений во время прокрутки.

Вот как планировать соединение в «обычных» режимах, которая включает в себя UITrackingRunLoopMode:

NSURLRequest *request = ... 
NSURLConnection *connection = [[NSURLConnection alloc] 
           initWithRequest:request 
           delegate:self 
           startImmediately:NO]; 
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] 
      forMode:NSRunLoopCommonModes]; 
[connection start]; 

Обратите внимание, что вы должны указать startImmediately:NO в инициализаторе, который, как представляется, противоречит документации Apple, который наводит на мысль вас может изменить режимы цикла работы даже после его запуска.

+1

Ты гений! –

+0

Хорошая работа - это только помогло мне. Спасибо – bandejapaisa

+0

работает красиво. Спасибо, что поделились, кстати, есть ли побочный эффект? – bneupaane

1

Вы должны прочитать на NSRunLoop. Я подозреваю, что во время прокрутки цикл выполнения работает в NSEventTrackingRunLoopMode, а NSURLConnection не включен в этот режим. Вы могли бы обойти это, позвонив в расписание NSURLConnectionInRunLoop: forMode :, так что загрузка может произойти во время прокрутки.

Это, вероятно, повлияет на производительность прокрутки, что, вероятно, является причиной отдельного режима цикла запуска. Но попробуйте и посмотрите, как он себя чувствует!

0

Первое ... ваше соединение, вероятно, даже не начинается, пока оно не попадет в mainRunLoop, и здесь также обрабатывается прокручивающая анимация.

Я столкнулся с той же проблемой и исправил ее, указав, что соединения для изображений начинаются сразу после создания.

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:wrapper.request delegate:wrapper]; 

    [connection start]; 

В завершении рутины, где вы получаете изображение и установить cell.imageView.image к полученному изображению, вы должны проверить, чтобы увидеть, если эта клетка принадлежит к одной из ячеек в настоящее время отображается в таблице. .. и если так вызывать [tableView reloadData].

NSInteger itemIndex = theIndexInTheRowDataOfTheCellYouStuffedTheImage 

    NSArray *indicies = [_tableView indexPathsForVisibleRows]; 
    NSUInteger rows = indicies.count; 

    if (rows > 0 && 
     itemIndex >= ((NSIndexPath *)[indicies objectAtIndex:0]).row && 
     itemIndex <= ((NSIndexPath *)[indicies objectAtIndex:rows - 1]).row) 
    {  
     [_tableView reloadData]; 
    } 
1

Если вы обернуть обновления изображения скачать & в качестве NSOperation, обновления будут происходить как стол с видом на свитках.

Другим преимуществом NSOperation является то, что вы можете отменить операцию, поскольку ячейка скользит по экрану. Он будет чувствовать себя намного более восприимчивым к пользователю. Особенно если они быстро прокрутят длинный список. В этом году техническая беседа Apple способствовала этой технике.

Если ваши списки не так долго или вы предпочитаете, чтобы они продолжали загружаться, вы можете вместо этого использовать приоритеты NSOperation.

+0

Я изначально разработал свой код, и это было здорово. Затем я перешел на Три20, который использует NSURLConnection и столкнулся с той же проблемой, о которой говорил Брэд. Я попробую начать и запустить предложения цикла ниже. –