将数据插入自定义对象

时间:2016-01-07 20:39:02

标签: ios nsarray

我对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数组,但就我所能得到的那样。将数组值分配给自定义类的最佳方法是什么?任何指导将不胜感激。

3 个答案:

答案 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;

}