2015-02-23 52 views
0

我有一個包含Parse.com PFUser對象的朋友的NSMutableArray。每個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 2015-02-23 09:40:05

+0

你想使用NSMutableDictionary而不是NSMutableArray。 NSDictionary是一種很好的方法,可以快速地使用密鑰來搜索。 – ErAcube 2015-02-23 09:41:09

回答

0

修改我們的代碼爲使用NSMutableArray..only

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 
      } 
     } 

使用對象

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 

希望它可以幫助你的Predicate..of陣列..!

+0

謝謝你。如果結果存在,將只有一個。所有用戶名都是唯一的。我真的需要過濾一個結果到一個單獨的數組嗎?這比我之前使用的循環更快嗎? – Kex 2015-02-23 10:34:44

+0

使用謂詞u可以做更多的優化,然後循環..更多使用謂詞結果將得到NSArray的條款,所以在你的情況下所有的用戶名都是唯一的,所以你可以直接使用結果數組的第一個對象.. 我修改了我的答案..檢查..是否有用...! – Vidhyanand 2015-02-23 10:55:22

0

使用NSPredicate,它應該是這個樣子:

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

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

試試這個,

- (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 2015-02-23 09:55:37

+0

如果用戶名稱是唯一的,那麼您可以更改謂詞以使用其他屬性進行過濾。 如果你使用for循環,那麼循環會運行100次(也就是說,如果你有100個對象在數組中),即使在找到所需的對象之後,你應該使用'Vidhyanand900'建議的'break'。 我認爲這是更好的方法,因爲我們不是通過所有elemants手動迭代,並且這兩種方法('for loop'&'NSPredicate')都必須遍歷所有元素。 – Saif 2015-02-23 10:38:46

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

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

希望這會對你有所幫助。

相關問題