2014-06-03 8 views
0

Я использую UICollectionView для отображения списка контактов, все из таблицы контактов в БД.Производительность UICollectionView с FMDB

Для каждого элемента, я бегаю запрос к FMDB, который возвращает один контакт, как это:

__block CTVSimpleContact *simpleContact = [CTVSimpleContact new]; 

[_queue inDatabase:^(FMDatabase *db) { 
    FMResultSet *result = [_db executeQuery:@"SELECT * FROM contacts " 
          @"LIMIT 1 OFFSET ?", [NSNumber numberWithInt:index]]; 

    while([result next]) { 
     [simpleContact setContactId:[result objectForColumnName:@"id"]]; 
     [simpleContact setDisplayName:[result stringForColumn:@"display_name"]]; 
     [simpleContact setEmail:[result stringForColumn:@"email"]]; 
     NSString *photoUri = [result stringForColumn:@"photo_uri_low"]; 
     if(photoUri != nil) { 
      [simpleContact setPhoto:photoUri]; 
     } 
    } 
}]; 

return simpleContact; 

Моя проблема заключается в том, что прокрутка происходит крайне медленно, и когда я профиль с помощью Time Profiler я получаю, что все время тратится на [результаты next] при чтении строки из таблицы.

Что было бы следующим шагом для оптимизации этого? Прокрутка чрезвычайно отсталая примерно на 2 КБ.

Спасибо!

ответ

0

Я использую fmdb для UICollectionView с заголовком, как NSDictionary с NSArray

@"Header1" : @[@"element1", @"element2", etc], 
@"Header1" : @[@"element1", @"element2", etc], 

Он работает очень быстро, так что, может быть, попробовать использовать этот InstEd класса CTVSimpleContact.

Кроме того, запрос

SELECT id, display_name, email, photo_uri_low FROM contacts LIMIT 1 OFFSET ? 

немного быстрее, чем

SELECT * FROM.. 

И, если у вас есть что-то вроде по умолчанию фото, если photo_uri_low = NULL можно использовать

IFNULL(photo_uri_low, "DEFAULT_PHOTO_URI_LOW") as photo_uri_low 
Смежные вопросы