2012-02-08 5 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으로 쓸 때. 작동하지만, 여기에 결함이있을 수 있습니다.

참고 : humanArrayHUMAN의 개체를 포함하고 human의 개체는 다음 특성을 포함합니다. name, age, gender, country, region.

2.) 나는 여기서 내가하고있는 일이 잘못이라고 생각한다. 사용자에게는 self.humanArray을 필터링하는 옵션이 제공됩니다. 사용자는 다음 기준 중 하나 이상을 사용하여 필터링 할 수 있습니다.

name, age, gender, country or region. 

내 코드는 다음과 같습니다. 사용자가 모든 필터 특성 (region, countryname)를 선택하면

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

ques 1.) 위의 술어에서 IN과 함께 ANY를 사용할 수 없습니까? ques 2.) 어떻게 할 수 있습니까? – Illep

+1

1) 그냥 아무 것도 건너 뛰십시오. 그런 식으로 사용하지 않아야합니다. 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]; 

속도가 빠르지는 않습니다.