本文主要是介绍新建Model涉及基本数据类型必须注意的问题——将基本数据类型转为NSNumber类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
将请求的数据使用KVC转为Model类型时,必须注意的是:
Model中涉及基本数据类型的属性都设置为NSNumber类型。否则如果使用基本数据类型的作为Model的属性当那么服务器端将这个属性的值改为null的时候,程序就会崩溃。所以以后无论建立任何Model类型都将基本数据类型设置为NSNumber类型。
新建工程:
打开本地Apache服务器中的demo.json如下:
具体代码如下:
为了不影响测试效果,所以在发送请求时使用了缓存策略——并传枚举值为1(意思是每次运行不加载缓存)
Message.h
//
// Message.h
// 模型中的数值问题
//
// Created by apple on 15/10/27.
// Copyright (c) 2015年 LiuXun. All rights reserved.
//#import <Foundation/Foundation.h>@interface Message : NSObject
// @property(nonatomic, assign) int messageId;
/*@property(nonatomic, assign) int messageId; ——>Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '[<Message 0x7fae89f933e0> setNilValueForKey]: could not set nil as the value for the key messageId.'First throw call stack:*/
/*使用NSNumber类型,防止服务器返回null,我们使用KVC赋值将会崩溃的问题*/
@property(nonatomic, copy)NSNumber *messageId;
@property(nonatomic, copy) NSString *message;@end
Message.m
//
// Message.m
// 模型中的数值问题
//
// Created by apple on 15/10/27.
// Copyright (c) 2015年 LiuXun. All rights reserved.
//#import "Message.h"@implementation Message-(NSString *)description
{return [NSString stringWithFormat:@"<%@, %p>{messageId: %d, messgage: %@}", self.class, self, self.messageId.intValue, self.message];
}
@end
viewController.m
//
// ViewController.m
// 模型中的数值问题
//
// Created by apple on 15/10/27.
// Copyright (c) 2015年 LiuXun. All rights reserved.
//#import "ViewController.h"
#import "Message.h"
@interface ViewController ()@end@implementation ViewController-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/demo.json"];// 为了便于测试,将缓存策略置为1表示不加载缓存NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:5];[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {NSLog(@"%@", [NSThread currentThread]);id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];NSLog(@"%@", result);Message *message = [[Message alloc] init];[message setValuesForKeysWithDictionary:result];NSLog(@"message= %@", message);}];
}@end
运行结果如下:
当我们用基本数据类型时,且后台此基本类型数据不为null时结果如下:
修改本地服务器的后台数据将基本数据类型messageId值改为null如下图:
打开网页刷新如下:
再次点击屏幕后台运行效果如下:
发现程序崩溃。
修改Model中的基本数据类型的messageId属性将其类型改为NSNumber类型。重新运行,效果如下:
发现如果服务器端数据类型为null时,Model中对应的NSnumber类型的属性的整型值变为0。但程序不会崩溃。
这篇关于新建Model涉及基本数据类型必须注意的问题——将基本数据类型转为NSNumber类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!