2015-08-01 2 views
1

Я пытаюсь проанализировать строку даты из словаря с возможностью недопустимого формата. Поэтому я зацикливаю словарь и пытаюсь проанализировать их с помощью DateFormatter.dateFromString в @try @catch.NSDateFormatter.dateFromString in for loop, с @try для обработки недопустимого формата

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"dd-MMM-yyyy"]; 

for(NSDictionary *mainSettlementData in mainSettlementDataList){ 

    NSString *dateString = [mainSettlementData objectForKey:@"settlementDate1"]; 
    if(dateString){ 
     NSLog(@"1"); 
     NSLog(@"dateString = %@", dateString); 
     @try{ 
      NSDate *settlementDate = [dateFormatter dateFromString:dateString]; 
      NSLog(@"converted NSDate = %@", settlementDate); 
     } 
     @catch(NSException *e){ 
      NSLog(@"Error parsing settlementDate : %@", e.description); 
     } 
     NSLog(@"2"); 
    } 
    else{ 
     NSLog(@"3"); 
    } 
} 
NSLog(@"Finish Loading Date"); 

Результат от NSLog хорошо до формата на вход в недействительна

2015-08-01 17:42:37.080 TrinityBackOffice[878:132472] 1 
2015-08-01 17:42:37.081 TrinityBackOffice[878:132472] dateString = 05-Aug-2014 
2015-08-01 17:42:37.084 TrinityBackOffice[878:132472] converted NSDate = 2014-08-04 17:00:00 +0000 
2015-08-01 17:42:37.084 TrinityBackOffice[878:132472] 2 
2015-08-01 17:42:37.084 TrinityBackOffice[878:132472] 1 
2015-08-01 17:42:37.084 TrinityBackOffice[878:132472] dateString = 02-Oct-2012 
2015-08-01 17:42:37.084 TrinityBackOffice[878:132472] converted NSDate = 2012-10-01 17:00:00 +0000 
2015-08-01 17:42:37.085 TrinityBackOffice[878:132472] 2 
2015-08-01 17:42:37.085 TrinityBackOffice[878:132472] 1 
2015-08-01 17:42:37.085 TrinityBackOffice[878:132472] dateString = 05-Aug-2014 
2015-08-01 17:42:37.085 TrinityBackOffice[878:132472] converted NSDate = 2014-08-04 17:00:00 +0000 
2015-08-01 17:42:37.085 TrinityBackOffice[878:132472] 2 
2015-08-01 17:42:37.085 TrinityBackOffice[878:132472] 1 
2015-08-01 17:42:37.086 TrinityBackOffice[878:132472] dateString = 05-Aug-2014 
2015-08-01 17:42:37.086 TrinityBackOffice[878:132472] converted NSDate = 2014-08-04 17:00:00 +0000 
2015-08-01 17:42:37.086 TrinityBackOffice[878:132472] 2 
2015-08-01 17:42:37.087 TrinityBackOffice[878:132472] 1 
2015-08-01 17:42:37.088 TrinityBackOffice[878:132472] dateString = <null> 
2015-08-01 17:42:37.088 TrinityBackOffice[878:132472] -[NSNull length]: unrecognized selector sent to instance 0xbabb48 
2015-08-01 17:42:37.088 TrinityBackOffice[878:132472] Error parsing settlementDate : -[NSNull length]: unrecognized selector sent to instance 0xbabb48 
2015-08-01 17:42:37.089 TrinityBackOffice[878:132472] 2 
2015-08-01 17:42:37.089 TrinityBackOffice[878:132472] 1 
2015-08-01 17:42:37.089 TrinityBackOffice[878:132472] dateString = 02-Oct-2012 

Затем протоколирование остановка, и приложение замораживания. Последний журнал NSLog (@ «Дата окончания загрузки»); никогда не распечатывайте. Обратите внимание, что я делаю это в viewDidLoad первого ViewController приложения, поэтому приложение замирает на странице заставки.

Также обратите внимание, что если в словаре нет недопустимой строки даты, приложение работает нормально. Если я удаляю линию

NSDate *settlementDate = [dateFormatter dateFromString:dateString]; 

приложение также отлично работает.

Пожалуйста, помогите, спасибо!

PS. Источник данных здесь, если вы хотите.

NSData *data = 
[@"{\"asOfDate\":\"23-Jul-2015\",\"portfolioData\":[{\"costValue\":11464.614,\"accountID\":\"99-91418-4\",\"mktValue\":10800,\"unrealizedAmt\":-664.61},{\"costValue\":0,\"accountID\":\"999-091418-0-3\",\"mktValue\":0,\"unrealizedAmt\":46600}],\"settlementData\":[{\"settlementDate2\":null,\"accountID\":\"99-00427-1\",\"netAmount3\":0,\"bankSym\":\"BBL\",\"settlementDate1\":\"05-Aug-2014\",\"netAmount1\":0,\"netAmount2\":0,\"bankAcc\":\"1310689722\",\"settlementDate3\":null},{\"settlementDate2\":\"05-Aug-2014\",\"accountID\":\"99-00427-4\",\"netAmount3\":3075.06,\"bankSym\":\"BBL\",\"settlementDate1\":\"02-Oct-2012\",\"netAmount1\":-86858.6,\"netAmount2\":-13096.74,\"bankAcc\":\"1310689722\",\"settlementDate3\":\"07-Aug-2014\"},{\"settlementDate2\":\"06-Aug-2014\",\"accountID\":\"99-00427-0\",\"netAmount3\":-226381.6,\"bankSym\":\"BBL\",\"settlementDate1\":\"05-Aug-2014\",\"netAmount1\":-442746.3,\"netAmount2\":323452.94,\"bankAcc\":\"1310689722\",\"settlementDate3\":\"07-Aug-2014\"},{\"settlementDate2\":\"06-Aug-2014\",\"accountID\":\"99-00427-0\",\"netAmount3\":-226381.6,\"bankSym\":\"BBL\",\"settlementDate1\":\"05-Aug-2014\",\"netAmount1\":-442746.3,\"netAmount2\":323452.94,\"bankAcc\":\"1310689722\",\"settlementDate3\":\"07-Aug-2014\"},{\"settlementDate2\":null,\"accountID\":\"99-00427-1\",\"netAmount3\":0,\"bankSym\":\"BBL\",\"settlementDate1\":null,\"netAmount1\":0,\"netAmount2\":0,\"bankAcc\":\"1310689722\",\"settlementDate3\":null},{\"settlementDate2\":\"05-Aug-2014\",\"accountID\":\"99-00427-4\",\"netAmount3\":3075.06,\"bankSym\":\"BBL\",\"settlementDate1\":\"02-Oct-2012\",\"netAmount1\":-86858.6,\"netAmount2\":-13096.74,\"bankAcc\":\"1310689722\",\"settlementDate3\":\"07-Aug-2014\"}],\"transactionStatus\":[]}" dataUsingEncoding:NSUTF8StringEncoding]; 

NSError *myError = nil; 
NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&myError]; 
NSArray *mainSettlementDataList = [responseDictionary objectForKey:@"settlementData"]; 

ответ

1

ваши данные в значении settlementDate1 возврата нулевой, так что вы проверить дату состояние не равно нулю, то устанавливается дата формиат.

Вы попробуйте этот код:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setDateFormat:@"dd-MMM-yyyy"]; 

     for(NSDictionary *mainSettlementData in mainSettlementDataList){ 

      NSString *dateString = [mainSettlementData objectForKey:@"settlementDate1"]; 
      if(![dateString isEqual:[NSNull null]]){ 
       NSLog(@"1"); 
       NSLog(@"dateString = %@", dateString); 

       NSDate *settlementDate = [dateFormatter dateFromString:dateString]; 
       NSLog(@"converted NSDate = %@", settlementDate); 
      } 
      else{ 
       NSLog(@"3"); 
      } 
     } 
     NSLog(@"Finish Loading Date"); 

или использовать это условие, чтобы проверить нулевое значение

if(dateString!=nil && ![dateString isEqualToString:@"null"] && dateString!=(id)[NSNull null]){ 
    // value 
}else{ 
    // null value 
} 
+0

Спасибо! Та работа. Я думал, что исключение будет обрабатывать нуль должным образом, но нет. Не могли бы вы объяснить, почему нуль разрушает мой код? Я думал, что попробовать и поймать будет достаточно. – kanpot2002

+0

Вы можете видеть, что ваши данные json в дате не имеют права? и поэтому значение null и нулевое значение, как можно преобразовать на дату с помощью date formate, из-за чего вы получаете ошибку. @ kanpot2002 –

+0

просто вы думаете, что получаете значение в строке и конвертируете в int, но ваше строковое значение равно null, которое вы не можете преобразовать в int, поэтому проверьте значение null на значение null или нет. @ kanpot2002 –