这个问题与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
的信息。
问题如下。当我为这些请求编写代码时,我肯定知道哪些字段被返回并且不使用空字段,但是过了一段时间我可能会忘记哪个请求返回了部分对象或者是完整的,并尝试使用空字段。所以可能会有很多错误,很难找到。
是否有针对该案例的任何做法,或者某些模式可用于确定对象是否已完全或部分加载并向开发人员发出警告?
答案 0 :(得分:0)
您可以将其实施为:
@implementation 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,你可以用nil替换0 是对象类型,即(id)类型或您可以根据您的方便使用默认值,以便您可以轻松跟踪它是否部分或完全加载
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
答案 1 :(得分:0)
我会使用KVO模式来解决这个问题。您可以做的是设置一个计数器,通过在要观察的属性上添加KVO来增加计数。然后,您可以在计数器上设置观察者,如果conter已达到预定计数(所有要加载的属性),则可以认为该对象已完全加载。