簡體   English   中英

當從plist加載NSMutableArray中的字符串時,為什么NSPredicate validateWithObject為nil

[英]Why is NSPredicate evaluateWithObject nil when searching for string within NSMutableArray loaded from plist

我正在嘗試檢查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”是一個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];
}

EvaluateWithObject:不起作用,因為“歌曲”不是收藏夾數組的屬性(或鍵)。 如果將您在帖子中顯示的單個詞典傳遞給valuateWithObject :,則它將有效,因為“歌曲”是該詞典的鍵。 方法filteredArrayUsingPredicate:獲取數組的每個成員(在您的情況下為字典),並將謂詞應用於該數組。

[favoritesArray filteredArrayUsingPredicate:condition]

將謂詞應用於數組中的每個元素 ,並返回帶有匹配元素的數組。

[condition evaluateWithObject:favoritesArray]

將謂詞應用於整個數組,並返回NO ,因為數組沒有“ song”屬性。 但是如果您將謂詞修改為

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

然后

[condition evaluateWithObject:favoritesArray]

應該給出預期的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM