2013-08-23 40 views
0

我有這樣的自定義類:濾波器的NSArray用的NSNumber的NSArray的與NSPredicate

@interface MyModel : NSObject 

@property (nonatomic,strong) NSString *id_name; 
@property (nonatomic,strong) NSArray *genres; 

@end 

的流派陣列的NSNumber秒的陣列。我充滿了MyModel對象另一個數組,例如:

MyModel *m = [[MyModel alloc] init]; 
m.id_name = @"2345"; 
m.genres = [NSArray arrayWithObjects:[NSNumber numberWithInt:3],[NSNumber numberWithInt:5],nil]; 

MyModel *m2 = [[MyModel alloc] init]; 
m2.id_name = @"259"; 
m2.genres = [NSArray arrayWithObjects:[NSNumber numberWithInt:7],[NSNumber numberWithInt:10],nil]; 

MyModel *m3 = [[MyModel alloc] init]; 
m3.id_name = @"25932as"; 
m3.genres = [NSArray arrayWithObjects:[NSNumber numberWithInt:7],[NSNumber numberWithInt:10],[NSNumber numberWithInt:15],nil]; 

myArray = [NSArray arrayWithObjects:m,m2,m3,nil]; 

現在我想篩選myArray使得類型包含在此數組的元素中:

NSArray *a = [NSArray arrayWithObjects:[NSNumber numberWithInt:7],[NSNumber numberWithInt:10],nil]; 

所以,myArray,後過濾,應包含對象m2m3。我可以用NSPredicate來做到這一點嗎?如果是這樣,怎麼樣?還是有另一種方式?

+0

是否需要包含* any *給定數組元素或* all *給定數組元素的對象? –

+0

所有元素,如果有可能... – Piero

回答

0

要查找具有給定數組a至少一個類型的對象,請使用

[NSPredicate predicateWithFormat:@"ANY genres in %@", a]; 

要查找具有所有流派定數組中,需要一個子查詢的對象:

[NSPredicate predicateWithFormat:@"SUBQUERY(genres, $g, $g IN %@)[email protected] = %d", a, [a count]]; 

(我們的想法是,以檢查是否是給定的陣列中的流派的數量等於 到陣列的大小。)

+0

我已經嘗試過,但似乎不起作用:(你嘗試過嗎? – Piero

+0

@Piero:是的,我完全用你的代碼試過了,它返回了'm2'和' m3'。 –

+0

好吧,也許我錯了,我看不是所有給定的數組元素,但對於任何... – Piero

1

馬丁R已經提供了一個優雅的答案,但如果我正確地理解你的問題,你也可以使用一個簡單的謂詞:

NSPredicate *allPred = [NSPredicate predicateWithFormat: @"ALL %@ IN genres", a]; 

NSArray *result = [myArray filteredArrayUsingPredicate: allPred]; 

此斷言會發現,包含流派所有包括MyModel小號在你的a陣列中。在測試數據的情況下,這將是ID爲25925932as的兩個對象。

+0

事實上,對於SUBQUERY來說,這是一個更簡單的選擇。 (事實證明,皮耶羅需要「任何」解決方案,但這個問題並不清楚。) –