在从plist加载的NSMutableArray中搜索字符串时,为什么NSPredicate evaluateWithObject为nil

时间:2013-11-23 17:11:03

标签: ios objective-c nsmutablearray plist nspredicate

我试图检查一个plist,如果我以前保存过值(歌曲)。 基本上这是为什么:

    if ([condition evaluateWithObject:favoritesArray] == YES) {
        return;
    }

在此期间评估为零:

if ([[favoritesArray filteredArrayUsingPredicate:condition] count] != 0) {
        return;
}

完全正常,完全相同的条件。

plist样本:

(
        {
        artist = Yuna;
        image = "";
        isFavorite = 1;
        song = "I Wanna Go (BELARBI REMIX)";
        thumbnail = "http://userserve-ak.last.fm/serve/64/94177627.png";
    }
)

印刷条件:

song = "I Wanna Go (BELARBI REMIX)"

注意:将条件更改为“song LIKE%@”会给出“无法对对象进行正则表达式匹配”错误。 “song.song”是一个NSString。

以下是完整的代码:

- (void) saveFavorite: (Songs*)song
{
    NSMutableArray *favoritesArray = [NSMutableArray arrayWithContentsOfFile:[MBCUtils dataFilePathWithFile:@"favorites.plist"]];
    NSPredicate *condition = [NSPredicate predicateWithFormat:@"song == %@" argumentArray:@[song.song]];
    if (favoritesArray == nil) {
        favoritesArray = [NSMutableArray arrayWithCapacity:1];
    } else {
        //favorite is already in list;
        NSLog(@"filtered favs: %@", [favoritesArray filteredArrayUsingPredicate:condition]);
        if ([[favoritesArray filteredArrayUsingPredicate:condition] count] != 0) {
            return;
        }
        // why this isn't working is beyond me;
        if ([condition evaluateWithObject:favoritesArray] == YES) {
            return;
        }
    }
    [favoritesArray addObject:[song toDictionary]];
    [favoritesArray writeToFile:[MBCUtils dataFilePathWithFile:@"favorites.plist"] atomically:YES];
}

2 个答案:

答案 0 :(得分:0)

EvaluateWithObject:不起作用,因为“song”不是favoritesArray的属性(或键)。如果你传递了你在帖子中显示的单个字典到evaluateWithObject:,它就会起作用,因为“song”是该字典的一个关键字。方法,filteredArrayUsingPredicate:获取数组的每个成员(在您的情况下为字典),并将谓词应用于它。

答案 1 :(得分:0)

[favoritesArray filteredArrayUsingPredicate:condition]

将谓词应用于数组中的每个元素并返回一个数组 匹配元素。

[condition evaluateWithObject:favoritesArray]

将谓词应用于整个数组,并返回NO,因为数组 没有“歌曲”属性。但是如果你将谓词修改为

NSPredicate *condition = [NSPredicate predicateWithFormat:@"ANY song == %@" argumentArray:@[song.song]];
// Or simply:
NSPredicate *condition = [NSPredicate predicateWithFormat:@"ANY song == %@", song.song];

然后

[condition evaluateWithObject:favoritesArray]

应该给出预期的结果。