2009-09-16 67 views
1

我已經閱讀了NSPredicate文檔,無法將我的頭一直包裹在它的周圍。我可以理解的簡單謂詞,但是現在如何爲以下情況創建一個謂詞:NSPredicate可以搜索另一個數組中的對象擁有的數組中的對象嗎?

我有一個Foo對象數組。在Foo類中,其中一個iVars是Bar對象的NSMutableArray。我需要過濾Foo對象的數組以獲得那些在其數組中具有特定Bar對象的對象。怎麼樣?

另外,它是否更容易(或可能)一次查找多個Bar對象,或者組合多個謂詞來搜索特定的Bar?

+0

你爲什麼要使用NSPredicate? – erotsppa 2009-09-16 17:44:22

+0

過濾數組。理論上可以應用無限數量的過濾器,並且需要將它們組合在一起,這看起來就像filteredArrayUsingPredicate:方法存在的確切原因。 – 2009-09-16 18:13:51

回答

3

我已經找到了我要找:

@class Foo { 
    int var1; 
    NSArray *barObjs; 
} 

predicate = @"var1 == 5 AND ANY barObjs.id == 5"; 
3

您的問題可以分爲兩個問題,我會盡量按順序回答。

  1. 您可以定義Foo情況下斷言,只有當Bar對象的實例的數組包含一個Bar實例匹配一個單獨的謂詞是真的。你想要的是一個[SUBQUERY][1]表達式。像這樣的謂詞字符串是匹配的Foo實例爲10的fooInt值和在barArray屬性Bar實例具有barInt值的1:

    @「fooInt == 10 & & SUBQUERY(barArray,$ X ,$ x.barInt == 1)。@ count> 0「

    SUBQUERY表達式的一般格式是SUBQUERY(collection, $var, predicate)。 A SUBQUERY表達式返回匹配predicatecollection中的對象集合,因此如果Foo實例具有與子查詢謂詞相匹配的Bar實例,則會採用它@count

  2. 您可以在SUBQUERY表達式中包含任意複雜的謂詞(包括嵌套的SUBQUERY表達式)。鑑於含子查詢表達式謂詞是執行(它們大致對應於一個SQL JOIN)通常是昂貴的,它可能會更好在SUBQUERY的結果使用OR搜索多個Bar實例在一個SUBQUERY表達式,然後用於測試的合適@count。像

    @謂詞字符串 「fooInt == 10 & & SUBQUERY(barArray,$ X,$ x.barInt == 1 || $ x.barInt == 2)。@計數> = 2」

    會發現Foo實例有一個Bar實例與barInt == 1和Bar實例與barInt == 2在Foo實例的barArray