Вы должны предварительно кэшировать свои изображения, а не делать это лениво. При прокрутке таблицы UITableViewDataSource:cellForRowAtIndexPath: вызывается метод, и если вы загружаете туда свои изображения, вы увидите, что он запрашивает содержимое вашей ячейки в качестве прокрутки, создавая задержку в вашем приложении. Попробуйте сделать свой cellForRowAtIndexPath: примерно так:
NSDate *date = [NSDate date];
... your cell loading code ...
NSLog( @"Elapsed time to generate cell %.2d", [date timeIntervalSinceNow] );
Вы увидите, сколько времени вы тратите на получение каждой ячейки.
Чтобы обойти это, вы можете быть настолько сложными, насколько вам нужно: если у вас много изображений, вам придется быть все более и более умным. Вы можете выполнить постраничную загрузку, где вы отслеживаете NSIndexPath последней запрошенной ячейки и определяете, идет ли прокрутка вверх или вниз, и используете +NSImage:imageNamed: для получения сразу нескольких страниц изображений вперед (т. е. на 5 изображений вперед от вашего текущего положения) или что-то еще, что вам подходит (используя тот факт, что людям приходится возвращать палец вниз к нижней части таблицы, чтобы снова провести пальцем, и, таким образом, потребление элементов таблицы имеет паузы — вы можете сделать размер страницы достаточно большим, чтобы заполнить свайп). Это, вероятно, все еще не очень хорошо, потому что вы просто будете страдать от всего своего воздействия сразу, а не от дрожащей нагрузки на каждую ячейку.
Вы можете быстро вернуть управление пользовательскому интерфейсу и позволить системе запланировать предварительно загруженную страницу изображений с помощью NSRunLoop:performSelector:target:argument:order:mode: вне основного цикла выполнения, используя NSImage:imageNamed:, а затем, когда запрашивается ячейка, если вы выполняете выборку достаточно далеко вперед, она будет доступна для отображения.
Вы должны быть болезненно осведомлены о проблемах с памятью. Если вы считаете, что это проблема, используйте NSImage:initWithContentsOfFile:, который очищает кэши изображений в ситуациях нехватки памяти. В зависимости от стратегии, используемой алгоритмом аннулирования кеша, эти ситуации могут вызвать «заикание» при очистке кешей и необходимости перезагрузки недействительных предварительных выборок.
person
groundhog
schedule
08.08.2009