我对ObjC还是有些新手,所以如果我的术语已经关闭,请原谅我。
我有一个webservice,它在数组中返回以下事件数据:
- eventName的
- eventAddress
- eventCity
Web服务阵列的大小会不时变化,具体取决于某一天发生的事件数量。
我的问题是我需要自动将此Web服务数据提取到自定义类(RandomEvent)中,但我不确定如何完全执行此操作。
我可以像这样手动完成,但由于webservice返回数组的大小不同,以这种方式执行它是没有意义的(见下文):
- (NSArray *)todaysEvents {
RandomEvent *event1 = [RandomEvent new];
[event1 setName:eventName[0]];
[event1 setAddress:eventAddress[0]];
[event1 setCity:eventCity[0]];
RandomEvent *event2 = [RandomEvent new];
[event2 setName:eventName[1]];
[event2 setAddress:eventAddress[1]];
[event2 setCity:eventCity[1]];
RandomEvent *event3 = [RandomEvent new];
[event3 setName:eventName[2]];
[event3 setAddress:eventAddress[2]];
[event3 setCity:eventCity[2]];
return @[event1, event2, event3];
}
我知道我将不得不迭代webservice数组,但就我所能得到的那样。将数组值分配给自定义类的最佳方法是什么?任何指导将不胜感激。
答案 0 :(得分:0)
假设eventName eventAddress eventCity
具有相同的长度,我们可以很容易地迭代它们。可变数组可用于保存所有创建的RandomEvent
个对象。请注意,如果eventAddress或eventCity数组之一的长度与其他数组不同,则还会进行安全检查。
- (NSArray *)todaysEvents {
NSMutableArray *eventsArray = [[NSMutableArray alloc] init];
for (int i = 0; i < eventName.count; i++){
if ((eventAddress.count < i) && (eventCity.count < i)){
RandomEvent *event = [[RandomEvent alloc] init];
[event setName:eventName[i]];
[event setAddress:eventAddress[i]];
[event setCity:eventCity[i]];
[eventsArray addObject:event];
}
}
return [NSArray arrayWithArray:eventsArray];
}
另一个建议是在从Web服务中读取RandomEvent
对象后立即创建它们。这样就不需要传递额外的数组了。
答案 1 :(得分:0)
代码:
- (NSArray *)todaysEvents {
NSMutableArray *resultArray = [NSMutableArray new];
for (int i = 0; i<eventName.count; i++) {
RandomEvent *event = [RandomEvent new];
[event setName:eventName[i]];
[event setAddress:eventAddress[i]];
[event setCity:eventCity[i]];
[resultArray addObject:event];
}
return [NSArray arrayWithArray:resultArray];
}
但据我了解,您正在尝试手动将收到的JSON解析为对象。这可能需要很长时间。尝试使用像https://github.com/EasyMapping/EasyMapping这样的映射框架。
答案 2 :(得分:0)
这不是特定于编程语言。这是更多的OOP问题
是的,你是对的,你必须遍历结果才能在DTO之间进行映射以查看模型。这可能听起来很重复,但解耦DTO和查看模型很重要/有帮助。
从你的示例代码看起来你有多个数组,对于eventName,eventAddress等。
最好有一个响应对象数组。
所以结构应该是ResponseObjects的数组
类ResponseObject @Property eventName @Property eventAddress @Property eventCity
****伪代码****
- (NSArray *)mapDTOtoViewModel:(NSArray)_responseArray {
//使用initWithCapacity而不是init
NSMutableArray viewModels = [NSMutableArray alloc] initWithCapacity:[_ responseArray count]];
//使用快速枚举以获得更好的性能
for(Response *响应在_responseArray中){
RandomEvent * event = [RandomEvent new];
[event setName:response.eventName];
[event setAddress:response.eventAddress];
[event setCity:response.eventCity];
[viewModels addObject:event];
}
return viewModels;
}