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最初のものと2番目のものについての情報は必要ありませんc

問題は次のとおりです。これらのリクエストのコードを書くとき、どのフィールドが返され、空のフィールドを使用しないかは確かにわかっていますが、しばらくすると、どのリクエストが部分的なオブジェクトまたは完全なオブジェクトを返したかを忘れて、空のフィールドを使用しようとすることがあります。そのため、見つけにくい多くのエラーが発生する可能性があります。

オブジェクトが完全にロードされているか部分的にロードされているかを判断し、開発者に警告するためのパターンはありますか?

4

2 に答える 2

0

次のように実装できます:

@実装 MyObject

-(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 に答える