Как справиться с сбоем NSJSONSerialization при отключении от интернета

Я реализую веб-сервис в своем приложении. Мой путь типичен.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //Web Service xxx,yyy are not true data NSString *urlString = @"http://xxx.byethost17.com/yyy"; NSURL *url = [NSURL URLWithString:urlString]; dispatch_async(kBackGroudQueue, ^{ NSData* data = [NSData dataWithContentsOfURL: url]; [self performSelectorOnMainThread:@selector(receiveLatest:) withObject:data waitUntilDone:YES]; }); return YES; } - (void)receiveLatest:(NSData *)responseData { //parse out the json data NSError* error; NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; NSString *Draw_539 = [json objectForKey:@"Draw_539"]; .... 

сообщение об ошибке консоли:

* Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «параметр данных равен нулю»

Когда мой iphone имеет подключение к Интернету, приложение работает успешно. Но если он отключится от Интернета, приложение столкнется с NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; Можете ли вы показать мне, как справиться с этой ошибкой? NSError ли NSError ?

Ошибка сообщает вам, что «responseData» равен нулю. Способ избежать исключения – проверить «responseData» и не вызывать JSONObjectWithData, если он равен нулю. Вместо этого отреагируйте, однако вы чувствуете, что вам нужно это условие ошибки.

Вы не проверяете, является ли ваш responseData нулем или нет, прежде чем передавать его в JSONObjectWithData:options:error: method.

Вероятно, вы должны попробовать:

 - (void)receiveLatest:(NSData *)responseData { //parse out the json data NSError* error; if(responseData != nil) { NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; NSString *Draw_539 = [json objectForKey:@"Draw_539"]; } else { //Handle error or alert user here } .... } 

EDIT-1: Для хорошей практики вы должны проверить этот объект error после JSONObjectWithData:options:error: метод для проверки и проверить, успешно ли данные JSON преобразованы в NSDictionary или нет.

 - (void)receiveLatest:(NSData *)responseData { //parse out the json data NSError* error; if(responseData != nil) { NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; if(!error) { NSString *Draw_539 = [json objectForKey:@"Draw_539"]; } else { NSLog(@"Error: %@", [error localizedDescription]); //Do additional data manipulation or handling work here. } } else { //Handle error or alert user here } .... } 

Надеюсь, это решит вашу проблему.

Дай мне знать, если тебе еще понадобится помощь.

  • iOS Отправить данные JSON в запросе POST с использованием NSJSONSerialization
  • FHSTwitterEngine - 'NSInvalidArgumentException', 'data parameter is nil'
  • Приложение NSJSONSerialization crashing
  • Городской дирижабль падает при вызове взлета
  • Объект является подклассом NSMutableDictionary, но сбой при методе мутации (NSJSONSerialization)
  • iOS: NSJSONSerialization приводит к тому, что «data paremeter is nil»
  • NSJSONSerialization Not Working, работает NSUTF8StringEncoding
  • iOS - NSJSONSerialization: невозможно преобразовать данные в строку вокруг символа
  • iOS JSON Parse не работает (возвращает нулевой словарь)
  • Невозможно разобрать Json в NSDictionary
  • Как преобразовать NSDictionary в пользовательский объект
  • Давайте будем гением компьютера.