NSJSONSerialization句柄返回数组或字典

时间:2013-12-11 22:38:42

标签: ios7 nsarray nsdictionary nsjsonserialization

我正在调用twitters API来为我的应用的特定部分加载一些推文。

一小部分用户在加载推文视图时报告崩溃,而其他用户根本没有问题。

我已将代码提交给Apple技术支持,他们回应让我知道NSJSONSerialization有时可以返回NSArray或NSDictionary。

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

部分解决方案是检测它是否是数组或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];


            }


        });
    }];

这是一个主要的错误,我需要压缩它,所以任何想法或信息将不胜感激!谢谢!

0 个答案:

没有答案