4

現在、スケジュールされたすべてのローカル通知をループして、userInfo 辞書オブジェクトの値に基づいて「一致」を見つけています。30 以上のローカル通知が設定されている場合、これは非常に遅いようです。配列をトラバースせずに個々のローカル通知にアクセスする方法はありますか?

ここに私が持っているものがあります:

NSArray *notificationArray = [[UIApplication sharedApplication]     scheduledLocalNotifications];
UILocalNotification *row = nil;
for (row in notificationArray) {
            NSDictionary *userInfo = row.userInfo;
            NSString *identifier = [userInfo valueForKey:@"movieTitle"];
            NSDate *currentAlarmDateTime = row.fireDate;
if([identifier isEqualToString:myLookUpName]) {
 NSLog(@"Found a match!");
}
}

ここに私が欲しいものがあります:

NSArray *notificationArray = [[UIApplication sharedApplication]     scheduledLocalNotifications];
UILocalNotification *row = " The row in notificationArray where [userInfo valueForKey:@"movieTitle"]=myLookUpName" ;
4

1 に答える 1

8

これに述語を使用できるかもしれませんが、私はそれをテストしていません:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userInfo.movieTitle = %@", myLookUpName];

次に、その述語を使用して配列をフィルタリングし、最初の要素を取得します。

UILocalNotification *row = [[notificationArray filteredArrayUsingPredicate:predicate]objectAtIndex:0];

繰り返しますが、これはテストされておらず、機能しない可能性があります。

編集

それが機能しない場合は、テストブロックを使用できます。

UILocalNotification *row = [[notificationArray objectsAtIndexes:[notificationArray indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
    return [[[obj userInfo]valueForKey:@"movieTitle"] isEqualToString:myLookUpName];
}]]objectAtIndex:0];
于 2012-04-15T19:00:34.200 に答える