Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么在从plist加载的NSMutableArray中搜索字符串时NSPredicate evaluateWithObject nil_Ios_Objective C_Nsmutablearray_Plist_Nspredicate - Fatal编程技术网

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

Ios 为什么在从plist加载的NSMutableArray中搜索字符串时NSPredicate evaluateWithObject nil,ios,objective-c,nsmutablearray,plist,nspredicate,Ios,Objective C,Nsmutablearray,Plist,Nspredicate,我试图在plist中检查我以前是否保存过值(歌曲)。 基本原因是: if ([condition evaluateWithObject:favoritesArray] == YES) { return; } 在以下情况下,评估结果为零: if ([[favoritesArray filteredArrayUsingPredicate:condition] count] != 0) { return; } 在完全相同的条件下工作得非常好 plis

我试图在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.song”是一个字符串

以下是完整的代码:

- (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];
}

EvaluateWithObject:无效,因为“歌曲”不是favoritesArray的属性(或键)。如果您将文章中显示的单个词典传递给evaluateWithObject:,则它将起作用,因为“宋”是该词典的键。filteredArrayUsingPredicate方法:获取数组的每个成员(在您的例子中是一个字典),并对其应用谓词

[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]