美文网首页iOS进阶指南
IOS 对远端json数据处理比较:KVC和直接赋值

IOS 对远端json数据处理比较:KVC和直接赋值

作者: 桃花流水鳜鱼肥 | 来源:发表于2016-07-27 16:05 被阅读305次

    LoginModel.h

    #import <Foundation/Foundation.h>
    @interface LoginModel : NSObject
    @property (copy, nonatomic) NSString *memberID;
    @property (copy, nonatomic) NSString *area;
    @property (copy, nonatomic) NSString *cityName;
    @property (assign, nonatomic) NSInteger memberLevel;
    
    - (void)loginWithParameter:(NSDictionary *)parameters success:(void(^)(NSString *successMsg))success failure:(void(^)(NSString *failureMsg))failure;
    @end
    

    LoginModel.m

    - (void)loginWithParameter:(NSDictionary *)parameters success:(void (^)(NSString *))success failure:(void (^)(NSString *))failure{
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        [manager POST:@"http://musicbox.jidait.com/WebApi/Member/Login"  parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            id result = [responseObject objectForKey:@"result"];
            if ([[result objectForKey:@"success"] boolValue]) {
                if (success) {
                    success(@"登陆成功");
                }
                NSDictionary *entity = [responseObject objectForKey:@"entity"];
            }
            else{
                if (failure) {
                    failure(@"登陆失败");
                }
            }
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            if (failure) {
                failure([error localizedDescription]);
            }
        }];
    }
    
    

    说明:
    山面代码中的entity就是获取的json串。

    对json的处理:

    通过访问器:

     NSDictionary *entity = [responseObject objectForKey:@"entity"];
    [self map:entity];
    
    - (void)map:(NSDictionary *)entity{
        self.memberID = [self filtereDictionary:entity ForKey:@"MemberID"];
        self.area = [self filtereDictionary:entity ForKey:@"Area"];
        self.cityName = [self filtereDictionary:entity ForKey:@"CityName"];
        self.memberLevel = [[self filtereDictionary:entity ForKey:@"MemberLevel"] integerValue];
    }
    
    
    /*处理三种情况:
     1.json中对应key不存在,那么程序抛出异常。
     2.key对应的值为[NSNull null],那么返回nil;
     */
    - (id)filtereDictionary:(NSDictionary *)entity ForKey:(NSString *)key{
        id value = [entity objectForKey:key];
        if (!value) {
            NSException *exception = [NSException exceptionWithName:@"警告" reason:@"字典中没有对应的Key" userInfo:nil];
            @throw exception;
        }
        if ([value isEqual:[NSNull null]]) {
            return nil;
        }
        return value;
    }
    

    通过kvc:

    NSDictionary *entity = [responseObject objectForKey:@"entity"];
    [self setValuesForKeysWithDictionary:entity];
    
    //找不到和key名字相同的属性时(苹果规定的优点复杂,具体可以看文档),会调用这个方法,重写可以进行特殊处理。
    - (void)setValue:(id)value forUndefinedKey:(NSString *)key{
        if ([key isEqualToString:@"MemberID"]) {
            [self setValue:value forKey:@"memberID"];
        }
        if ([key isEqualToString:@"Area"]) {
            [self setValue:value forKey:@"area"];
        }
        if ([key isEqualToString:@"CityName"]) {
            [self setValue:value forKey:@"cityName"];
        }
        if ([key isEqualToString:@"MemberLevel"]) {
            [self setValue:value forKey:@"memberLevel"];
        }
    }
    

    比较
    直接赋值:
    1.需要判断字典key是否存在,如果不存在需要注意是不是写错了,或者和后台沟通有错误。
    2.需要判断key对应的value是否为[NSNull null].
    3.需要判断key对应的属性的类型,进行对应的处理

    而通过kvc:
    1.通过forUndefinedKey处理entity中的key和属性的对应。如果entity中key和属性名字不同,如代码中的大小写不同,可以判断后手动修改。
    2.如果entity中有些key不需要,重写forUndefinedKey就就能安全处理。比如entity中有个key叫photo,但是这个字段我们用不到,正常情况下程序会抛出异常,但是只要我们重写了- (void)setValue:(id)value forUndefinedKey:(NSString *)key就没事。
    2.[NSNull null]自动转化为nil。
    3.自动根据属性类型进行转化

    结论:
    两种感觉差不多,根据需要选择。

    相关文章

      网友评论

        本文标题:IOS 对远端json数据处理比较:KVC和直接赋值

        本文链接:https://www.haomeiwen.com/subject/xfvojttx.html