Получить объект из массива по условию - PullRequest
1 голос
/ 18 марта 2012

В моем приложении у меня есть класс сущности, подобный:

#import <Foundation/Foundation.h>

@interface classAbc : NSObject
{
    NSString *strTitle;
    int iId;


}

@property(nonatomic, retain)  NSString *strTitle;
@property(nonatomic) int iId;
@end

и в моем NSMutableArray я храню объекты этого класса как:

classAbc *objAbc=[[classAbc alloc] init];
objAbc.iId=1;
objAbc.strTitle=@"Title 1";

classAbc *objAbc1=[[classAbc alloc] init];
objAbc1.iId=2;
objAbc1.strTitle=@"Title 2";

NSMutableArray *arrTemp=[[NSMutableArray alloc] initWithObjects:objAbc,objAbc1,nil];

[objAbc release];
[objAbc1 release];

и теперь во время выполнения я хочу получить объект из этого массива на основе условия objAbc.iId, например:

, если arrTemp содержит объект, имеющий значение iId, например, 2.

Может ли кто-нибудь предложить другой способ, кроме как для итерации цикла? Поскольку число объектов может увеличиться, для цикла потребуется много времени, чтобы найти его.

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 16 октября 2012

Используйте ПредикатВитБлок: чтобы получить объект определенного свойства. Ссылка NSPredicate

  • (NSPredicate *) ForexateWithBlock: (BOOL (^) (идентификатор оцененный объект, NSDictionary * привязки)) блок
1 голос
/ 18 марта 2012

Я предлагаю вам использовать NSMutableDictionary для хранения вашего объекта, где ключ - это идентификатор объекта, а значение - сам объект.Если вы не возражаете против заказа, используйте этот подход.

classAbc *objAbc=[[classAbc alloc] init];
objAbc.iId=1;
objAbc.strTitle=@"Title 1";

classAbc *objAbc1=[[classAbc alloc] init];
objAbc1.iId1=2;
objAbc1.strTitle1=@"Title 2";


NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:objAbc1 forKey:objAbc1.iId1];

.
.
.

classAbc *abc = (classAbc*)[dict objectForKey:[NSNumber numberWithInt:2]];

Примечание : изменить идентификатор с типа int на тип NSNumber, чтобы вы могли сохранить его как ключ

0 голосов
/ 27 апреля 2012

После поиска я получил ответ на этот вопрос.Использование NSPredicate - лучший способ для таких условий.Используя NSPredicate, мы можем применить условие к любому члену объекта класса.

Это ссылка для MAC OS X, но она работает на iPhone SDK с некоторыми изменениями NSP предикат

0 голосов
/ 18 марта 2012

Вы можете посмотреть на FilterArrayUsingPredicate: но, честно говоря, это, вероятно, просто быстрое перечисление в фоновом режиме.

Убедитесь, что ваш цикл for на самом деле является быстрым циклом перечисления, а не счетчиком массива в качестве целого числа цикла:

for (classAbc* obj in arrTemp)
{
    // check for your match
    break; // if found
}

Попробуйте только что-то более сложное, если это действительно даету вас измеримые проблемы с производительностью.

...