2013-07-04 3 views
0

У меня есть NSArray, содержащий объекты NSDictionary.Фильтрация NSArray с предикатом оставляет дополнительный результат?

Мне нужно отфильтровать объекты на основе выбора значений, поэтому я создал массив значений, которые я хочу фильтровать и используя предикат с форматом и подавать ему массив объектов.

Это своего рода работа, но странно в ситуациях, когда я знаю, что я должен получать пустой массив. Я получаю один объект, которого не должно быть.

Я выписал значение массива значений фильтра, и я ясно вижу, что он содержит ключ, который соответствует id_str объекта, поэтому его не следует возвращать.

Ниже приведен код, который я использую, любые указатели, в которых я ошибаюсь, были бы очень полезными!

    //Create new fetch request 
      NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

      //Set new predicate to only fetch tweets that have been favourited 
      NSPredicate *filterFavourite = [NSPredicate predicateWithFormat:@"favouriteTweet == 'YES'"]; 

      //Setup the Request 
      [request setEntity:[NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:_managedObjectContext]]; 

      //Assign the predicate to the fetch request 
      [request setPredicate:filterFavourite]; 
      NSError *error = nil; 

      //Create an array from the returned objects 
      NSArray *favouriteTweets = [_managedObjectContext executeFetchRequest:request error:&error]; 
      NSAssert2(favouriteTweets != nil && error == nil, @"Error fetching events: %@\n%@", [error localizedDescription], [error userInfo]); 

      //Create a new array containing just the tweet ID's we are looking for 
      NSArray *favouriteTweetsID = [favouriteTweets valueForKey:@"tweetID"]; 

      NSLog(@"%@", favouriteTweetsID); 

      //Create a new predicate which will take our array of tweet ID's 
      NSPredicate *filterFavouritsearchPredicate = [NSPredicate predicateWithFormat:@"(id_str != %@)" argumentArray:favouriteTweetsID]; 

      //Filter our array of tweet dictionary objects using the array of tweet id's we created 
      NSArray *filteredTweets = [self.timelineStatuses filteredArrayUsingPredicate:filterFavouritsearchPredicate]; 

      //Send those tweets out to be processed and added to core data 
      [self processNewTweets:filteredTweets]; 

      NSLog(@"Update Favoutited Tweets: %@", filteredTweets); 
+0

Можете ли вы также отправить вывод 'NSLog'? И как он отклоняется от того, что вы ожидаете увидеть? –

+0

Вы уверены, что в строках нет ведущих/конечных пробелов? – Wain

ответ

4

Это, вероятно, не делать то, что вы намерены:

[NSPredicate predicateWithFormat:@"(id_str != %@)" argumentArray:favouriteTweetsID]; 

Это эквивалентно

[NSPredicate predicateWithFormat:@"(id_str != %@)", id1, id2, ... idN]; 

где ID1, ID2, ..., IDN являются элементами favouriteTweetsID. Строка формата имеет только один спецификатор формата, так, что все, кроме первый элемент игнорируется, и вы просто

[NSPredicate predicateWithFormat:@"(id_str != %@)", id1]; 

Если вы хотите, чтобы отфильтровать все объекты, где id_str не равно ни одному из элементов массива ,

[NSPredicate predicateWithFormat:@"NOT id_str IN %@", favouriteTweetsID]; 
+0

Ты мой друг - абсолютная легенда, и то, что ты поставил, имеет смысл теперь, когда ты написал это, дерево для деревьев, которое я думаю! Благодаря! –

Смежные вопросы