¿Qué falla para acceder a la count de la línea de time de Twitter?

Probé el código para get acceso a la línea de time de Twitter. No recibió ningún dato del server. ¿Qué salió mal aquí?

ACAccount *twitterAccount=[arrayOfAccounts lastObject]; NSURL *requestURL=[NSURL URLWithString:@"http://api.twitter.com/1/statuses/user_timeline.json"]; NSMutableDictionary *parameters=[NSMutableDictionary new]; //[parameters setObject:@"100" forKey:@"count"]; //[parameters setObject:@"1" forKey:@"include_entities"]; SLRequest *post=[SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:requestURL parameters:parameters]; post.account=twitterAccount; [post performRequestWithHandler:^(NSData *response, NSHTTPURLResponse *urlResponse, NSError *error) { self.array=[NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error]; if(self.array.count !=0) NSLog(@"%@",self.array); else NSLog(@"No Data Recived"); 

Gracias por adelantado.

Twitter tiene consejos para usar la versión 1.1 y no consejos v1. En la versión 1.1 api https, intente utilizar esta url https://api.twitter.com/1.1/statuses/user_timeline.json instado de esta url http://api.twitter.com/1/statuses/user_timeline.json . Este trabajo está bien.

Esos objects NSError que le da la API? Su propósito es decirte qué salió mal. Usalos, usalos a ellos.

Tu problema es que no sabes qué pasó porque simplemente intentas convertir a JSON. Eso es lo que pudo haber salido mal:

  • falló la request (por ejemplo, problema de networking)
  • no estás autorizado a hacer lo que hiciste
  • los datos devueltos no son en realidad JSON
  • el object JSON no es una matriz (habría dado lugar a un locking).

Para escribir un código defensivo (y eso es lo que quiere si quiere divulgarlo al público), debe verificar cada uno de estos pasos para averiguar qué salió mal, para que pueda actuar en consecuencia. Sí, eso tomará más código, pero less código no siempre es la mejor opción.

El código con un mejor event handling errores se vería más así. Tenga en count cómo verifica el resultado de cada paso que podría salir mal:

 [post performRequestWithHandler:^(NSData *response, NSHTTPURLResponse *urlResponse, NSError *error) { if (response) { // TODO: might want to check urlResponse.statusCode to stop early NSError *jsonError; // use new instance here, you don't want to overwrite the error you got from the SLRequest NSArray *array =[NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&jsonError]; if (array) { if ([array isKindOfClass:[NSArray class]]) { self.array = array; NSLog(@"resulted array: %@",self.array); } else { // This should never happen NSLog(@"Not an array! %@ - %@", NSStringFromClass([array class]), array); } } else { // TODO: Handle error in release version, don't just dump out this information NSLog(@"JSON Error %@", jsonError); NSString *dataString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; NSLog(@"Received data: %@", dataString ? dataString : response); // print string representation if response is a string, or print the raw data object } } else { // TODO: show error information to user if request failed NSLog(@"request failed %@", error); } }];