2012-02-08 12 views
1

NSPredicateに関するいくつかの問題があります。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で、次の属性を含んでいます。 name,age,gender,country,region

2.)私はここでやっていることは間違っていると思います。ユーザーには、self.humanArrayをフィルタリングするオプションが与えられます。ユーザーは、次の基準のうちの1つ以上を使用してフィルタリングすることができます。

name, age, gender, country or region. 

私のコードは次のようになります。ユーザがすべてのフィルタ属性(regioncountryname)を選択した場合

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]]; 

このコードは、動作します。上記のコードを見ると、第1述語の出力配列が第2述語のフィルタリングに使用されていることがわかります。そういうわけで、それがこのように振舞う理由です。

私は上記のコードを変更する必要があります。そのため、ユーザーはフィルタリングの目的で任意の属性を入力します。 regionまたはcountryまたはnameです。

答えて

1
  1. foo INは、すでに配列内の任意のオブジェクトfooを意味します。 ANYに続けて基本式を指定します(例ANY objects.value < 13)。 INは集合式です。
  2. 一時的な値を使用して、実際に使用されている属性によってのみフィルタを適用できますか?
+0

質問1.上記の述語でINにANYを使用することはできませんか? ques 2.)私はそれを行う方法の例を教えてもらえますか? – Illep

+1

for 1)ANYをスキップすると、そのように使われることはありません 2)変更可能な配列を作成し、各述語の結果からオブジェクトを追加してからremoveDuplicates –

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]; 

速度に関してはそれほど悪くありません。