2015-02-23 2 views
0

У меня есть NSMutableArray друзей, который содержит объекты Parse.com PFUser. Каждый PFUser имеет поле NSString. Я хочу найти этот массив для объекта, содержащего определенную строку. До сих пор я использую это:Поиск массива для объекта и проверка соответствия поля NSString

NSString username = "bob"; 
PFUser *user = [[PFUser alloc] init]; 

     for(PFUser *userItem in self.currentUser.friends) { 

      if([user.username isEqualToString:username]) { 

       user=userItem; 
      } 
     } 

Есть ли лучший способ сделать это? Является ли это намного медленнее, чем использование словаря NSMutable, а затем просто вытаскивая объект таким образом? Мой размер массива составляет около 100. Благодаря

+0

'NSPredicate' должен сделать трюк. Но если вы хотите оптимизировать, вы должны выйти из цикла, как только найдете его. – Larme

+0

Вы хотите использовать NSMutableDictionary вместо NSMutableArray. NSDictionary - это хороший способ быстро выполнить поиск, поскольку ключ используется для поиска. – ErAcube

ответ

0

Изменить уры кода, ниже ... с использованием NSMutableArray .. только

NSString username = "bob"; 
PFUser *user = [[PFUser alloc] init]; 

     for(PFUser *userItem in self.currentUser.friends) { 
      //In your code it is written as user.username instead of userItem.username..check it.. 
      if([userItem.username isEqualToString:username]) { 

       user=userItem; 
       break;//exit from loop..Results in optimisation 
      } 
     } 

Использования Predicate..of массива объектов

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", username]; 
NSArray *results = [self.currentUser.friends filteredArrayUsingPredicate:predicate]; 
PFUser *user=[[PFUser alloc]init]; 
user=[results objectAtIndex:0];//here is the object u need 

Надеется, что это помогает! ..

+0

Спасибо за это. Если результат существует, его будет только когда-либо. Все имена пользователей уникальны. Должен ли я действительно фильтровать один результат в отдельный массив? Это быстрее, чем цикл, который я использовал раньше? – Kex

+0

Использование Predicate u может сделать больше оптимизации, а затем цикл. Более того, используя Predicate, результаты получат с точки зрения NSArray, поэтому In ur ​​case Все имена пользователей уникальны, поэтому вы можете напрямую использовать первый объект массива результатов. Я изменил свой ответ ..Проверить ... Это полезно или нет ...! – Vidhyanand

0

Используйте NSPredicate, это должно выглядеть примерно так:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.object.stringInsideObject LIKE %@", stringToCompare]; 

    NSArray *filteredArray = [[NSArray alloc] initWithArray:[yourArray filteredArrayUsingPredicate:predicate]]; 
0

Try Это,

- (PFUser *)filterUserObjectWithName:(NSString *)userName 
{ 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.username == %@",userName]; 
    NSArray *results = [self.currentUser.friends filteredArrayUsingPredicate:predicate]; 
    return results.count ? [results firstObject]: nil; 
} 

Надеется, что это помогает

+0

Если результат существует, его будет только когда-либо. Все имена пользователей уникальны. Должен ли я действительно фильтровать один результат в отдельный массив? Это быстрее, чем цикл, который я использовал раньше? – Kex

+0

, если имена пользователей уникальны, вы можете изменить предикат для фильтрации с каким-либо другим свойством. Если вы используете цикл loop, цикл будет выполняться 100 раз (скажем, если у вас есть 100 объектов в массиве), даже после нахождения требуемого объекта вы должны использовать 'break', как это предлагает' Vidhyanand900'. Я думаю, что это лучший способ, поскольку мы не итерируем вручную все элементы, и оба метода ('for loop' &' NSPredicate') должны проходить все элементы в любом случае. – Saif

0
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF. username contains[c] %@", stringToCompare]; 

NSArray *filteredArray = [[NSArray alloc] initWithArray:[yourArray filteredArrayUsingPredicate:predicate]]; 

Надеюсь, это вам поможет.

Смежные вопросы