Повышение производительности iPhone - загрузка изображений из базы данных SQLite3 - PullRequest
0 голосов
/ 08 октября 2009

У меня проблемы с производительностью при загрузке около 60 изображений из таблицы SQLite3 со следующей таблицей:

select rowid, thumbnail
from my_table
where category_id = 4

У меня есть индекс для category_id, но загрузка таблицы 170 изображений PNG 70x70 занимает около 2,5 секунд.

В моем коде я создаю NSMutableArray объектов, представляющих каждую строку, например:

    Item* item = [[Item alloc] init];
    item.rowid = sqlite3_column_int( statement, 0 );

    int thumbnailLength = sqlite3_column_bytes( statement, 1 );
    NSData* data = [NSData dataWithBytes:sqlite3_column_blob( statement, 1 ) length:thumbnailLength];
    item.thumbnail = [[UIImage imageWithData:data] autorelease];

    [result addObject: item]

iPhoto может загружать альбом практически без видимого времени загрузки. Есть ли какой-то трюк с SQLite3, который мне не хватает, который может повысить производительность здесь?

1 Ответ

1 голос
/ 08 октября 2009

Держу пари, что приложение «Фотографии» загружает только миниатюрные изображения, которые видны на экране в определенный момент времени, получая другие, когда вы прокручиваете список в своем альбоме. Это легко сделать, используя Core Data в 3.x, NSFetchedResultsController и его setFetchBatchSize: метод. Ручная реализация этого с использованием необработанного SQLite потребует намного больше кода, но это все же выполнимо. Этот подход имеет преимущества как по времени загрузки, так и по памяти.

При обращении к данным SQLite я не заметил значительного времени загрузки, извлекающего до 17 150 x 50 изображений PNG из базы данных SQLite, поэтому есть вероятность, что что-то еще замедляет работу. Вы также можете попробовать запустить Instruments and Shark в своем методе загрузки данных, чтобы увидеть, действительно ли SQLite является вашим узким местом. У меня был случай, когда я предположил, что это так, но оказалось, что у меня была неэффективная подпрограмма обработки строк, которая действительно замедляла мое создание объектов из данных SQLite.

...