在 NSDictionary 中查询 if/else 语句中的值
Posted
技术标签:
【中文标题】在 NSDictionary 中查询 if/else 语句中的值【英文标题】:Querying an NSDictionary for values in an if/else statement 【发布时间】:2014-05-01 19:52:16 【问题描述】:我的解析云代码函数设置为以 JSON 形式返回数据,如下所示:
response.success
(
"results": [
"Number of top categories": top2.length ,
"Top categories": top2 ,
"Number of matches": userCategoriesMatchingTop2.length ,
"User categories that match search": userCategoriesMatchingTop2
]
);
我想做的是在我的 Objective-C 代码中查询这个 JSON 数组,并通过使用底部的 if 语句根据返回的内容执行某些操作。例如,它说:
if ([result intValue] == 1)
[self performSegueWithIdentifier:@"ShowMatchCenterSegue" sender:self];
我想用一条语句替换result intValue
,说明 JSON 数据中“匹配数”的值等于 1。
- (IBAction)nextButton:(id)sender
if (self.itemSearch.text.length > 0)
[PFCloud callFunctionInBackground:@"eBayCategorySearch"
withParameters:@@"item": self.itemSearch.text
block:^(NSString *result, NSError *error)
NSLog(@"'%@'", result);
NSData *returnedJSONData = result;
NSError *jsonerror = nil;
NSDictionary *categoryData = [NSJSONSerialization
JSONObjectWithData:returnedJSONData
options:0
error:&jsonerror];
if(error) NSLog(@"JSON was malformed.");
// validation that it's a dictionary:
if([categoryData isKindOfClass:[NSDictionary class]])
NSDictionary *jsonresults = categoryData;
/* proceed with jsonresults */
else
NSLog(@"JSON dictionary wasn't returned.");
if (!error)
// if 1 match found clear categoryResults and top2 array
if ([result intValue] == 1)
[self performSegueWithIdentifier:@"ShowMatchCenterSegue" sender:self];
// if 2 matches found
else if ([result intValue] == 2)
[self performSegueWithIdentifier:@"ShowUserCategoryChooserSegue" sender:self];
//default to selected categories criteria -> send to matchcenter -> clear categoryResults and top2 array
// if no matches found, and 1 top category is returned
else if ([result intValue] == 2)
[self performSegueWithIdentifier:@"ShowCriteriaSegue" sender:self];
// if no matches are found, and 2 top categories are returned
else if ([result intValue] == 2)
[self performSegueWithIdentifier:@"ShowSearchCategoryChooserSegue" sender:self];
];
【问题讨论】:
使用间接返回NSError
的方法时,Cocoa要求在使用NSError
之前检查直接返回值,而不是错误是否为nil
。如果方法指示失败,错误是 guaranteed 是有效的,但相反的 - 它将是 nil
成功 - not 保证,即使你将它设置为 @987654330事先@。
您遇到了什么问题?您需要知道结果字典中有多少项?完全不清楚您所说的“匹配数”是什么意思。
如果你看一下我返回的 JSON,"Number of matches"
是其中一个键,它的值是从我的云代码中的 userCategoriesMatchingTop2
数组的长度得出的。在这种情况下,如果userCategoriesMatchingTop2.length
等于 1,我想告诉我的 ios 应用执行某个操作。
实现这一目标您面临的困难是什么?
我不确定如何形成执行此操作所需的语法。我查看了 NSDictionary 文档,但不清楚我将如何处理这种特殊情况。
【参考方案1】:
据我了解,您获得的响应 JSON
数据是字典中的字典数组。
要检索这些值中的每一个,您可以使用以下步骤:
第 1 步:
将字典数组从结果字典中分离成一个NSArray
对象。
NSArray *resultArray = [resultDictionary objectForKey:@"results"];
第 2 步:
现在您有了resultArray
,您可以提取所需的值,如下所示:
假设你想要NSNumber
对象"Number of matches"
的值,
你知道它是resultArray
中的3rd
对象,所以它的索引是2
。
NSDictionary *dictionary = [resultArray objectAtIndex:2];
NSNumber *numberOfMatches = [dictionary objectForKey:@"Number of matches"];
现在您可以在任何地方使用[numberOfMatches intValue]
。
希望这会有所帮助! :)
【讨论】:
这绝对是正确且有意义的。但是,当我像这样设置代码并运行它时,应用程序崩溃并返回:codeshare.io/9lnvz 请将您用来分隔字典中数据的行移至if (!error)
块。
另外请使用异常断点来获取崩溃的确切位置。
从response data,我观察到"Top categories"
和"User categories that match search"
是一个数字数组。所以你需要将这些字段的类型设置为NSArray
,而不是NSNumber
。以上是关于在 NSDictionary 中查询 if/else 语句中的值的主要内容,如果未能解决你的问题,请参考以下文章
ASIHttpRequest - 如何将参数的 NSDictionary 转换为 url 编码的查询参数字符串?
NSDictionary 变成 1 NSMutableArray
如何使用包含Swift中相同键的多个值的查询参数构建URL?