Проблема с производительностью при получении пользовательских объектов из массива - PullRequest
1 голос
/ 05 августа 2011

Я создаю пользовательский объект, который имеет некоторые свойства, такие как идентификатор и заголовок, описание и т. Д.

И я добавляю его в массив. (Этот массив может содержать более 500 значений).

И я использую следующий код для извлечения пользовательских объектов,

-(CustomObjects *)getObjectWithId:(int)id    {

    CustomObjects *objCustomObjects = nil;

    for (CustomObjects *customObjects in arrayCustomObjects)  {

        if (customObjects.id == id) {

            objCustomObjects = customObjects;
            break;
        }
    }


    return objCustomObjects;
}

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

Как повысить производительность при извлечении объектов?

заранее спасибо,

Ответы [ 6 ]

1 голос
/ 05 августа 2011

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

- (void) addCustomObject: (CustomObject*) obj {
    NSNumber *wrappedID = [NSNumber numberWithInt:[obj idNumber]];
    [dictionary setObject:obj forKey:wrappedID];
}

- (CustomObject*) findObjectByID: (int) idNumber {
    NSNumber *wrappedID = [NSNumber numberWithInt:[obj idNumber]];
    return [dictionary objectForKey:wrappedID];
}

словарь (такжевызываемая хеш-таблица ) не должна проходить все значения, чтобы найти правильное, она имеет все значения, расположенные хитро в соответствии с клавишами, чтобы она могла перейти к правому или близко к нему.То, что вы делаете с массивом, называется линейный поиск , и это не очень эффективно.

0 голосов
/ 05 августа 2011

Вместо int просто используйте [NSNumber numberWithInt:], я внес некоторые изменения в ваш код.

-(CustomObjects *)getObjectWithId:(NSNumber* )id    {//changed int to NSNumber

    CustomObjects *objCustomObjects = nil;

    NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF.id==%@",id];
    NSArray *result = [array filteredArrayUsingPredicate:bPredicate];
//return filtered array contains the object of your given value

    if([result count]>0)
        objCustomObjects = [result objectAtIndex:0];

    }
    return objCustomObjects;
}
0 голосов
/ 05 августа 2011

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

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

Я уже создал вспомогательный класс для этого имени CWOrderedDictionary.Это подкласс NSMutableDictionary, который обеспечивает доступ к объектам по обоим ключам (как в любом словаре) и по индексу с использованием методов, идентичных NSMutableArray.

Мой класс доступениспользовать для вдохновения или как здесь: https://github.com/jayway/CWFoundation/

0 голосов
/ 05 августа 2011

Использовать NSPredicate: -

Вы получите отфильтрованный массив с объектом, для которого передан идентификатор;

NSPredicate * предикат = [NSPredicate предикатWithFormat: @ "id ==% @", id];

NSArray * Filter = [arrayCustomObjects FilterArrayUsingPredicate: предикат];

0 голосов
/ 05 августа 2011

Вы можете использовать NSPredicate, который проверяет, равен ли id тот, который вы ищете, и просто фильтровать пользовательские объекты, используя этот предикат, вызывая filteredArrayUsingPredicate:.

Чтобы повысить производительность, я бы попытался отложить все, что вы пытаетесь вычислить, не напрямую вызывая функцию, выполняющую тяжелую работу в представлении прокрутки, а скорее вызывая [self performSelector:... withObject:nil afterDelay:0];, которая откладывает вычисление до следующего цикла выполнения цикла , Если вы проверите, запланировано ли уже вычисление, прежде чем вызывать executeSelector, вы действительно сможете уменьшить частоту вычислений, сохраняя четкий интерфейс.

0 голосов
/ 05 августа 2011

Лучше вы можете использовать NSDictionary с id в качестве ключа. Вы можете легко получить объект из словаря.

Это нормально для вашего требования?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...