Я пытаюсь проанализировать строку даты из словаря с возможностью недопустимого формата. Поэтому я зацикливаю словарь и пытаюсь проанализировать их с помощью 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"];
Спасибо! Та работа. Я думал, что исключение будет обрабатывать нуль должным образом, но нет. Не могли бы вы объяснить, почему нуль разрушает мой код? Я думал, что попробовать и поймать будет достаточно. – kanpot2002
Вы можете видеть, что ваши данные json в дате не имеют права? и поэтому значение null и нулевое значение, как можно преобразовать на дату с помощью date formate, из-за чего вы получаете ошибку. @ kanpot2002 –
просто вы думаете, что получаете значение в строке и конвертируете в int, но ваше строковое значение равно null, которое вы не можете преобразовать в int, поэтому проверьте значение null на значение null или нет. @ kanpot2002 –