Ios7 NSJSONSerialization句柄返回数组或字典

Ios7 NSJSONSerialization句柄返回数组或字典,ios7,nsarray,nsdictionary,nsjsonserialization,Ios7,Nsarray,Nsdictionary,Nsjsonserialization,我正在调用twitters API为我的应用程序的特定部分加载一些tweet 一小部分用户在加载tweets视图时报告了崩溃,而其余用户则没有任何问题 我已经向苹果技术支持部门提交了代码,他们回复说NSJSONSerialization有时会返回NSArray或NSDictionary 显然,它会抛出一个错误,即对NSDictionary对象调用的是objectAtIndex:is,我相信这是我所有用户的罪魁祸首 部分解决方案是检测它是数组还是NSDictionary 这就是我现在的处境: id

我正在调用twitters API为我的应用程序的特定部分加载一些tweet

一小部分用户在加载tweets视图时报告了崩溃,而其余用户则没有任何问题

我已经向苹果技术支持部门提交了代码,他们回复说NSJSONSerialization有时会返回NSArray或NSDictionary

显然,它会抛出一个错误,即对NSDictionary对象调用的是objectAtIndex:is,我相信这是我所有用户的罪魁祸首

部分解决方案是检测它是数组还是NSDictionary

这就是我现在的处境:

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编译成可以通过电子邮件发送和读取的字符串吗?这似乎是至少读取用户收到的错误的最合乎逻辑的方法。