2013-01-08 187 views
-1

我有一個UILocalNotification s的數組。在每個通知中都有一個userInfo屬性,它是一個NSDictionary。在userInfo中,我設置了一個密鑰@"ID",該值是一個唯一的ID。檢查對象數組是否包含字符串

所以我想要做的是檢查通知的數組是否有任何userInfo屬性的值爲@"test"的密鑰@"ID"然後返回YES否則NO。我知道如何通過for循環來實現這一點,但我想知道是否有更好的方法來實現它。

回答

2

您可以使用-[NSArray indexesOfObjectsPassingTest:]這會佔用匹配對象,NO否則返回YES塊:

NSArray *array = ...; 
NSIndexSet *matchingIndexes = [array indexesOfObjectsPassingTest:^BOOL(UILocalNotification *notification, NSUInteger idx, BOOL *stop) { 
    return [notification.userInfo[@"ID"] isEqualToString:@"test"]; 
}]; 
return [matchingIndexes count] != 0; 
+0

性能方面這是優於一個for循環?如果沒有,我會投票for for循環,因爲它(對我來說)更具可讀性。 –

+1

我會避免[過早優化](http://programmers.stackexchange.com/questions/80084/is-premature-optimization-really-the-root-of-all-evil),這是有效的,它可以做到你想要,你真的認爲你已經產生了足夠的通知,這成爲一個性能問題? – Joe

+0

何時需要設置「BOOL * stop = YES」? –

2

我猜想,你就不可能做的更好性能方面比基本快速列舉 - - 也許使用的一個方法,允許併發「的選項枚舉」 - 但也有寫你想要做什麼肯定更優雅的方式:

[[array valueForKeyPath:@"userInfo.ID"] containsObject:@"test"]; 
相關問題