Я звоню в API твиттеров, чтобы загрузить некоторые твиты для определенного раздела моего приложения.
Небольшая часть пользователей сообщает о сбое при загрузке просмотра твитов, в то время как у остальных проблем нет.
Я отправил код в службу технической поддержки Apple, и они ответили, сообщив мне, что NSJSONSerialization может иногда возвращать NSArray или NSDictionary.
Очевидно, что он выдаст ошибку objectAtIndex: вызывается для объекта NSDictionary, который, как я считаю, является виновником для всех моих пользователей.
Частичное решение состоит в том, чтобы определить, является ли это массивом или 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.
Вот как выглядит весь метод getUserFeed, который отправляет запрос в Twitter:
// 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];
}
});
}];
Это ГЛАВНАЯ ошибка, и мне нужно ее устранить, поэтому любые идеи или информация будут очень признательны! Спасибо!