使用NSPredicate查找具有以@开头的键的对象

时间:2014-03-28 13:47:07

标签: objective-c nspredicate

我将这个JSON对象加载到NSDictionary中:

media =     {
       photos =         {
           photo =             (
                               {
                   "$t" = "http://some url";
                   "@id" = 1;
                   "@size" = x;
               },
                               {
                   "$t" = "http://another url";
                   "@id" = 1;
                   "@size" = fpm;
               },
                               {
              );
       };
};

我正在尝试搜索照片数组并仅使用@size属性= x返回照片。

我认为这会有效,但它会返回零对象:

 NSObject *photo = [[photos valueForKeyPath:@"media.photos.photo"] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%@ == x",@"@size"]];

我尝试在' x'周围添加单引号。但那也失败了。我认为属性名称本身中的@符号会导致问题。任何帮助将不胜感激。

修改

以@开头的关键似乎是问题所在。如果我尝试使用NSPredicate搜索数组,它会抛出一个" NSUnknownKeyException ...类不符合键值"错误。

我可以使用这样的嵌套for循环进行搜索:

for (id photo in photos)
 {
     for (id key in photo) 
     {
         id value = [photo objectForKey:key];

         if ([key isEqualToString:@"@size"] && [value isEqualToString:@"x"])
         {
           stringXLargePhotoUrl = [photo valueForKey:@"$t"];
           break;
          }
      }
      if (stringXLargePhotoUrl != Nil)
         break;
   }

但这很笨重。如果可能的话,我宁愿使用NSPredicate。我无法控制JSON对象,因此我无法将密钥更改为不以@开头。

1 个答案:

答案 0 :(得分:0)

这篇文章非常好,可以提供帮助http://nshipster.com/nspredicate/

  

%@是对象值的var arg替换 - 通常是字符串,   号码或日期。

     

%K是密钥路径的var arg替换。

更改

 ... [NSPredicate predicateWithFormat:@"%@ == x",@"@size"]];

 ... [NSPredicate predicateWithFormat:@"%K == x",@"@size"]];

@K)。