1

这个问题与 iOS 没有严格的联系,但是由于我在 iOS 应用程序中遇到了这个问题,所以我会用 Objective-C 来说话。

我的 iOS 应用程序是一个客户端,它从服务器获取一些数据。来自服务器的数据是 json,它与我的类映射。当服务器只发送对象的必要部分时,就会出现问题。

可以说完整的对象是

{
"a" : 1,
"b" : 2,
"c" : 3
}

我映射到的班级是

@class MyObject
{
    int a, b, c;
}

@property (nonatomic) int a, b, c;

-(id) initFromDictionary:(NSDictionary*)dict

@end

@implementation MyObject

-(id) initFromDictionary:(NSDictionary*)dict
{
    self = [super init];
    if (self)
    {
        a = [dict[@"a"] intValue];
        b = [dict[@"b"] intValue];
        c = [dict[@"c"] intValue];
    }
    return self;
}

@end

服务器可以发送

{
"a" : 1,
"c" : 3
}

请求getAandC

{
"a" : 1,
"b" : 2
}

对于另一个 - getAandB (这些请求不依赖,它们唯一相似的是它们使用的对象)。我不需要关于b第一个和c第二个的任何信息。

问题如下。当我为这些请求编写代码时,我肯定知道返回了哪些字段并且不使用空字段,但是一段时间后我可能会忘记哪个请求返回了部分对象或全部对象,并尝试使用空字段。所以可能会有很多错误,很难找到。

是否有针对这种情况的任何做法,或者可能有一些模式来确定对象是完全加载还是部分加载并警告开发人员?

4

2 回答 2

0

我会使用 KVO 模式来解决这个问题。您可以做的是设置一个计数器,通过在要观察的属性上添加 KVO 来增加计数。然后,您可以在计数器上设置观察者,如果计数器已达到预定计数(所有要加载的属性),您可以认为对象已完全加载。

于 2013-08-28T13:56:52.787 回答
0

您可以将其实现为:

@implementation 我的对象

-(id) initFromDictionary:(NSDictionary*)dict
{
    self = [super init];
    if (self)
    {

         a = ([dict objectForKey: @"a"]) ? [[dict objectForKey: @"a"] intValue] : 0;
         b = ([dict objectForKey: @"b"]) ? [[dict objectForKey: @"b"] intValue] : 0;
         c = ([dict objectForKey: @"c"]) ? [[dict objectForKey: @"c"] intValue] : 0;

// 如果变量 a 、 b 、 c 是对象类型,即 (id) 类型,则此处可以将 0 替换为 nil已加载

        if ((a == 0) || (b == 0) || (c == 0)) 
        {      
          NSLog(@"object is Partially loaded with values a : %d , b : %d , c : %d", a,b,c);
        }else{
          NSLog(@"object is Completely loaded with values a : %d , b : %d , c : %d", a,b,c);
        }   


    }

    return self;

}




@end

或者

@implementation MyObject

-(id) initFromDictionary:(NSDictionary*)dict
{
    self = [super init];
    if (self)
    {
        NSArray *keys = [dict AllKeys];
        for(NSString * key in keys)
        {
         [self setValueToItsVariableForKey:key fromDictionary: dict]; 
        }
    }
    return self;
}

- (void)setValueToItsVariableForKey:(NSString *)key fromDictionary: (NSDictionary *)dict 
{

    switch ([key intValue]) 
   {

      case : a

          a = [[dict objectForKey: key] intValue];
          break;

      case : b

          b = [[dict objectForKey: key] intValue];
          break;  

      case : c

          c = [[dict objectForKey: key] intValue];
          break;

   }  

} 


@end
于 2013-08-28T11:20:06.353 回答