Ios7 NSJSONSerialization句柄返回数组或字典
我正在调用twitters API为我的应用程序的特定部分加载一些tweet 一小部分用户在加载tweets视图时报告了崩溃,而其余用户则没有任何问题 我已经向苹果技术支持部门提交了代码,他们回复说NSJSONSerialization有时会返回NSArray或NSDictionary 显然,它会抛出一个错误,即对NSDictionary对象调用的是objectAtIndex:is,我相信这是我所有用户的罪魁祸首 部分解决方案是检测它是数组还是NSDictionary 这就是我现在的处境:Ios7 NSJSONSerialization句柄返回数组或字典,ios7,nsarray,nsdictionary,nsjsonserialization,Ios7,Nsarray,Nsdictionary,Nsjsonserialization,我正在调用twitters API为我的应用程序的特定部分加载一些tweet 一小部分用户在加载tweets视图时报告了崩溃,而其余用户则没有任何问题 我已经向苹果技术支持部门提交了代码,他们回复说NSJSONSerialization有时会返回NSArray或NSDictionary 显然,它会抛出一个错误,即对NSDictionary对象调用的是objectAtIndex:is,我相信这是我所有用户的罪魁祸首 部分解决方案是检测它是数组还是NSDictionary 这就是我现在的处境: id
id feedData = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&jsonError];
if ([feedData isKindOfClass:[NSArray class]]) {
//Is array
} else if ([feedData isKindOfClass:[NSDictionary class]]) {
//is dictionary
}
我基本上每次都需要一个NSArray。所以在is数组块中,我基本上只使用feedData,但在NSDictionary中,如何将其转换为与我需要的结构匹配的NSArray
老实说,最大的问题是我看不到NSDictionary结构的样子,因为我的测试设备或模拟器都没有返回NSDictionary数据,它们都返回NSArray
下面是将请求发送到twitter的整个getUserFeed方法的样子:
// Get the twitter feed
NSURL *requestURL = [NSURL URLWithString:TW_API_TIMELINE];
// Set up proper parameters
NSMutableDictionary *timelineParameters = [[NSMutableDictionary alloc] init];
[timelineParameters setObject:kNumTweets forKey:@"count"];
[timelineParameters setObject:@"1" forKey:@"include_entities"];
// Create the Social Request
SLRequest *postRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:requestURL parameters:timelineParameters];
postRequest.account = self.delegate.userAccount;
// Perform the request
[postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
// Check if we reached the reate limit
if ([urlResponse statusCode] == 429) {
// Rate limit reached
// Display an alert letting the user know we have hit the rate limit
UIAlertView *twitterAlert = [[UIAlertView alloc] initWithTitle:kRateLimitTitle
message:kRateLimitMessage
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[twitterAlert show];
// Stop animating the pull to refresh if it is animating
[self.feedTableView.pullToRefreshView stopAnimating];
return;
}
// Check if there was an error
if (error) {
NSLog(@"Error: %@", error.localizedDescription);
// Stop animating the pull to refresh if it is animating
[self.feedTableView.pullToRefreshView stopAnimating];
return;
}
// Check if there is some response data
if (responseData) {
NSError *jsonError = nil;
id feedData = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&jsonError];
if ([feedData isKindOfClass:[NSArray class]]) {
//Is array
NSLog(@"It's an Array");
} else if ([feedData isKindOfClass:[NSDictionary class]]) {
//Is dictionary
NSLog(@"It's a Dictionary");
} else {
//is something else
}
if (!jsonError) {
[self gatherTweetsFromArray:feedData];
} else {
// Stop animating the pull to refresh if it is animating
[self.feedTableView.pullToRefreshView stopAnimating];
// Alert the user with the error
UIAlertView *twitterAlert = [[UIAlertView alloc] initWithTitle:kErrorTitle
message:kErrorMessage
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[twitterAlert show];
}
} else {
// Stop animating the pull to refresh if it is animating
[self.feedTableView.pullToRefreshView stopAnimating];
// Alert the user with the error
UIAlertView *twitterAlert = [[UIAlertView alloc] initWithTitle:kErrorTitle
message:kErrorMessage
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[twitterAlert show];
}
});
}];
这是一个主要的错误,我需要压扁它,所以任何想法或信息都将不胜感激!谢谢大家! 不知道字典的结构,就没有完美的解决办法。我假设——因为只有一些用户报告了崩溃——字典结构在异常情况下返回,例如当twitter服务器出现内部错误时。我认为只要在返回数组以外的任何内容时显示“未知错误警报”,就可以了。此外,您还可以使用第三方chrash reporter(建议使用Crashlytics)或自制解决方案进行一些崩溃报告。。。。。。e、 要求用户向您发送一封电子邮件,自动附加字典的调试说明。我在Twitter API上发布了一些显示实际调用块的代码。如果这是推特的内部错误,它是否应该每次都只影响某些用户?这是一个小数字,但它是一致的,从来没有实际工作。谢谢你的信息和Crashlytics链接,我一定会调查的!我不知道有几个用户一直存在这个问题。你还认识这些用户吗?如果是这样的话,只需寻找他们的共同点(iOS版本、防火墙等),就可以重现错误。您熟悉如何将feedData编译成可以通过电子邮件发送和读取的字符串吗?这似乎是至少读取用户收到的错误的最合乎逻辑的方法。