2012-02-08 38 views
1

我有幾個有關NSPredicates的問題,這裏是他們;編寫一個NSPredicate

1.)我的代碼如下;

NSArray *arr= [self.humanArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ANY name IN %@ ", nameArray]]; 

我得到以下異常;

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet.' 

*** Call stack at first throw: 

當我寫謂詞爲@"name IN %@ ", nameArray。它有效,但我認爲這可能有一些缺陷。

注意:humanArray包含HUMAN的對象,而human的對象包含以下屬性。 nameagegendercountry,region

2.)我想我在這裏做什麼是錯誤的。用戶可以選擇過濾self.humanArray。用戶可以使用以下標準中的一項或多項進行篩選;

name, age, gender, country or region. 

我的代碼看起來像這樣;

NSArray *fRegionArray= [self.humanArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"regionIN %@ ", regionArray]]; 



NSArray *fCountryArray= [fRegionArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"country IN %@ ", countryArray]]; 



NSArray *fNameArray= [fCountryArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name IN %@ ", nameArray]]; 

此代碼的工作,如果用戶選擇的所有過濾器的屬性(regioncountryname)。如果你看上面的代碼,你會注意到第一個謂詞的輸出數組用於第二個謂詞中的過濾。所以這就是它以這種方式行事的原因。

我需要修改上面的代碼,以便用戶可以輸入任何屬性進行過濾。 regioncountryname

回答

1
  1. foo IN已經表示所述數組中的任何對象foo。你會使用ANY後跟一個基本表達式(例如ANY objects.value < 13)。 IN是一個聚合表達式。
  2. 您可以使用臨時值並僅通過實際使用的屬性對其進行過濾?
+0

對於問題1)所以我不能在上面的謂詞中使用任何與IN? 問題2)你能告訴我一個例子怎麼做嗎? – Illep 2012-02-08 16:31:15

+1

for 1)只是略過ANY,並不意味着要這樣使用 2)只需創建一個可變數組,然後從每個謂詞的結果中添加對象,然後removeDuplicates – 2012-03-15 13:14:22

1

我在我的一個項目中做了這個我需要根據多個條件過濾一個對象數組。

NSPredicate *filterBlock = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *criteria){ 

      NSString *name = [criteria objectForKey:@"name"]; 
     NSString *gender =.................... 

     YourObject *yo = (YourObject*)obj; 
     if (yo.name isEqualToString:name && yo.gender isEqualToString:gender) { 
      // refine all your criteria 
      return YES; 
     } else { 
      return NO; 
     } 
}]; 


NSArray *result = [arrayToBeFiltered filteredArrayUsingPredicate:filterBlock]; 

它的工作,並沒有那麼差的速度。