我已經閱讀了NSPredicate文檔,無法將我的頭一直包裹在它的周圍。我可以理解的簡單謂詞,但是現在如何爲以下情況創建一個謂詞:NSPredicate可以搜索另一個數組中的對象擁有的數組中的對象嗎?
我有一個Foo對象數組。在Foo類中,其中一個iVars是Bar對象的NSMutableArray。我需要過濾Foo對象的數組以獲得那些在其數組中具有特定Bar對象的對象。怎麼樣?
另外,它是否更容易(或可能)一次查找多個Bar對象,或者組合多個謂詞來搜索特定的Bar?
我已經閱讀了NSPredicate文檔,無法將我的頭一直包裹在它的周圍。我可以理解的簡單謂詞,但是現在如何爲以下情況創建一個謂詞:NSPredicate可以搜索另一個數組中的對象擁有的數組中的對象嗎?
我有一個Foo對象數組。在Foo類中,其中一個iVars是Bar對象的NSMutableArray。我需要過濾Foo對象的數組以獲得那些在其數組中具有特定Bar對象的對象。怎麼樣?
另外,它是否更容易(或可能)一次查找多個Bar對象,或者組合多個謂詞來搜索特定的Bar?
我已經找到了我要找:
@class Foo {
int var1;
NSArray *barObjs;
}
predicate = @"var1 == 5 AND ANY barObjs.id == 5";
您的問題可以分爲兩個問題,我會盡量按順序回答。
您可以定義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
表達式返回匹配predicate
的collection
中的對象集合,因此如果Foo
實例具有與子查詢謂詞相匹配的Bar
實例,則會採用它@count
。
您可以在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
。
你爲什麼要使用NSPredicate? – erotsppa 2009-09-16 17:44:22
過濾數組。理論上可以應用無限數量的過濾器,並且需要將它們組合在一起,這看起來就像filteredArrayUsingPredicate:方法存在的確切原因。 – 2009-09-16 18:13:51