我的后端是Parse.com。我有一些用户使用NSDate对象数组作为他们完成某些操作的时间戳。
我正在尝试读取该数组中的最后一个对象,以测试它是否在一天的前3个小时内完成。
下面是我遇到的奇怪的问题。在我的物理设备上,我加载了假设的NSDate对象的数组,并将对象和对象类记录到控制台。我得到了以下信息:
OBJECT: 2016-01-19T01:09:18.239Z
CLASS: __NSCFString因为它不是NSDate对象,所以我使用格式化程序使其成为一个格式化程序并进行计算。到目前为止还没有崩溃。
当我在模拟器上运行相同的代码时,我得到以下结果:
OBJECT: 2016-01-20 05:50:34 +0000
CLASS: __NSDate因此,应用程序崩溃了(理应如此),因为我正在尝试使用格式化程序,将一个已经存在的NSDate对象从一个字符串转换为一个NSDate,而实际上它并不是。
-[__NSDate length]: unrecognized selector sent to instance 0x7ffcf3f9c480所以我想也许这些对象实际上是不同的。我转到Parse.com并复制对象。它们是相同的:
["2015-12-20T17:47:38.134Z"]
["2016-01-20T05:50:34.253Z"]我知道我可以检查它是NSCFString还是NSDate,并相应地处理它们,但我很好奇问题是什么。任何帮助都是非常感谢的。已经做了一整天了。干杯。
编辑:在我的物理设备上运行几次之后。一些对象将显示为NSCFString,其他对象将显示为NSDate。再次检查Parse.com以确保所有对象都相同,并再次检查为true。
["2016-01-20T06:07:41.435Z"]
["2016-01-20T06:07:39.454Z"]
["2016-01-20T04:53:53.419Z"]发布于 2016-01-20 14:45:19
这里有两种方法可以帮助你处理这类问题。第一个返回NSDate对象,第二个返回字符串日期格式。您可以使用其中的一个或两个。
- (NSDate*) getDateFromObject:(id) object{
if ([object isKindOfClass:[NSDate class]]) {
return (NSDate*)object;
}
else if ([object isKindOfClass:NSString.class]){
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSDate *date = [dateFormatter dateFromString:object];
return date;
}
// return nil otherwise
return nil;
}
- (NSString*) getStringFromObject:(id) object{
if ([object isKindOfClass:NSString.class]) {
return (NSString*)object;
}
else if ([object isKindOfClass:NSDate.class]){
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSString *dateString = [dateFormatter stringFromDate:object];
return dateString;
}
// return nil otherwise
return nil;}
发布于 2016-03-27 01:21:14
我在这里也面临着同样的问题。我的情况是,我正在接收一个JSON对象数据,并将其序列化为具有NSDate值的对象。为此,您只需使用少量的手动编码将文本作为NSDate传递,而不是从web服务传递普通字符串:
示例(显示错误):
- (void)userFromJson:(NSData *)object error:(NSError **)error {
NSError *localError = nil;
NSDictionary *parsedObject = [NSJSONSerialization JSONObjectWithData:object options:0 error:&localError];
if (localError != nil) {
*error = localError;
return;
}
for (NSDictionary *keyDict in parsedObject) {
for (NSString *key in keyDict) {
if ([self respondsToSelector:NSSelectorFromString(key)]) {
[self setValue:[keyDict valueForKey:key];
}
}
}
}更正一条:
- (void)userFromJson:(NSData *)object error:(NSError **)error {
NSError *localError = nil;
NSDictionary *parsedObject = [NSJSONSerialization JSONObjectWithData:object options:0 error:&localError];
if (localError != nil) {
*error = localError;
return;
}
for (NSDictionary *keyDict in parsedObject) {
for (NSString *key in keyDict) {
if ([self respondsToSelector:NSSelectorFromString(key)]) {
if ([key isEqualToString:@"dateOfBirth"]) {
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-mm-dd"];
NSDate *d = [df dateFromString:[keyDict valueForKey:key]];
[self setValue:d forKey:key];
}
else {
[self setValue:[keyDict valueForKey:key] forKey:key];
}
}
}
}
}这对我来说很有效,但我正在尝试找到一种方法,以便不对可能的变量名进行硬编码(你知道...模块化编码)。
希望这对你有帮助。
编辑:经过少量的工作,我得到了以下解决方案:
在你的相关类中,你必须#import <objc/runtime.h> ...然后,您可以检查本地对象参数类型并执行相应操作:
- (void)userFromJson:(NSData *)object error:(NSError **)error {
NSError *localError = nil;
NSDictionary *parsedObject = [NSJSONSerialization JSONObjectWithData:object options:0 error:&localError];
if (localError != nil) {
*error = localError;
return;
}
for (NSDictionary *keyDict in parsedObject) {
for (NSString *key in keyDict) {
if ([self respondsToSelector:NSSelectorFromString(key)]) {
objc_property_t property = class_getProperty([self class], [key UTF8String]);
if ([[self getClassOfProperty:property] isSubclassOfClass:[NSNumber class]]) {
NSScanner *scanner = [NSScanner scannerWithString:[keyDict valueForKey:key]];
if ([scanner scanFloat:NULL]) {
[self setValue:@([[keyDict valueForKey:key] floatValue]) forKey:key];
}
else if ([scanner scanInt:NULL]) {
[self setValue:@([[keyDict valueForKey:key] integerValue]) forKey:key];
}
else {
}
}
else if ([[self getClassOfProperty:property] isSubclassOfClass:[NSDate class]]) {
NSDateFormatter *df = [[NSDateFormatter alloc] init];
NSString *stDate = (NSString *)[keyDict valueForKey:key];
if ([stDate length] == 10) {
[df setDateFormat:@"yyyy-MM-dd"];
}
else {
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
}
NSDate *d = [df dateFromString:stDate];
[self setValue:d forKey:key];
}
else if ([[self getClassOfProperty:property] isSubclassOfClass:[NSString class]]) {
[self setValue:[keyDict valueForKey:key] forKey:key];
}
else if ([[self getClassOfProperty:property] isSubclassOfClass:[NSData class]]) {
[self setValue:[NSData dataWithBytes:[[keyDict valueForKey:key] UTF8String] length:[[keyDict valueForKey:key] length]]
forKey:key];
}
else {
}
}
}
}
}
-(Class)getClassOfProperty:(objc_property_t)property {
NSString *objType = [NSString stringWithUTF8String:property_getAttributes(property)];
NSUInteger start = [objType rangeOfString:@"\""].location;
NSUInteger end = [objType rangeOfString:@"\","].location;
NSRange range;
range.location = start + 1;
range.length = end - range.location;
NSString *objType2 = [objType substringWithRange:range];
return [NSClassFromString(objType2) class];
}现在为了更通用,不使用特定的格式,您可以使用NSDataDetector,请参阅http://www.techanswering.com/question/show/converting-nsstring-to-nsdate-and-back-again
https://stackoverflow.com/questions/34892685
复制相似问题