Проблемы многомерного массива - PullRequest
1 голос
/ 25 января 2012

Я создаю многомерный массив для разделов / строк на основе данных json из нашего API. Глядя на журналы, добавление строк и разделов выглядит хорошо, но когда я делаю nslog разделы, он показывает только группу последнего объекта. Похоже, строки не добавляются в разделы.

Что я делаю неправильно, чтобы последний объект API отображался в разделах x раз? х представляет счет Джона. self.appointments является NSArray *

Согласно многомерному массиву target-c он должен работать.

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
        NSMutableArray *sections = [[NSMutableArray alloc] init];
        NSMutableArray *rows = [[NSMutableArray alloc] init];
        NSString *lastDate = nil;
        for (NSDictionary *dict in [json objectForKey:@"data"]) {
            NSString *date = [dict objectForKey:@"date"];
            NSLog(@"Dates: %@ - %@", date, lastDate);
            if (date != lastDate) {
                if (lastDate == nil) {
                    NSLog(@"Adding Row 1");
                    [rows addObject:dict];
                    lastDate = date;
                } else {
                    NSLog(@"Adding Section 1");
                    NSLog(@"Adding #rows %i",[rows count]);
                    [sections addObject:rows];
                    [rows removeAllObjects];
                    NSLog(@"Adding Row 2 %@",[dict objectForKey:@"start_time"]);
                    [rows addObject:dict];
                    lastDate = date;
                }
            } else {
                NSLog(@"Adding Row 3");
                [rows addObject:dict];
            }
        }
        if (rows) {
            NSLog(@"Adding Section 2");
            NSLog(@"Adding #rows %i",[rows count]);
            [sections addObject:rows];
        }
        NSLog(@"Sections: %@", sections);

        self.appointments = [sections mutableCopy]; //I have also tried self.appointments = sections

        sections = nil;
        rows = nil;

Журналы показывают

Sections: (
        (
                {
            abbrev = "";
            account = "";
            "addOnService_id" = "";
            alert = "";
            "appt_id" = 1839384;
            "appt_id_unique" = 1839384;
            "appt_status_description" = "";
            "appt_status_type" = "";
            "c_id" = 47;
            cost = "0.00";
            "coupon_id" = "";
            "creation_emp_id" = 2288;
            "creation_timestamp" = 201111040717;
            "customer_id" = 0;
            "customer_notes" = "";
            "customer_package_id" = "";
            date = 20121228;
            "employee_id" = 2288;
            "employee_notes" = "";
            employer = "";
            "end_time" = 570;
            "first_name" = "";
            "history_id" = 1830959;
            key = 134;
            "last_emp_id" = 2288;
            "last_name" = "";
            "last_timestamp" = 201111040717;
            "lead_description" = "";
            "link_id" = 0;
            "location_name" = "Telephonic Setup/Training";
            "make_id" = "";
            "middle_name" = "";
            "model_id" = "";
            "model_year" = "";
            name = "My Name ";
            odometer = "";
            "other_vehicle" = "";
            "package_name" = "";
            "payment_type_description" = "";
            "payment_type_id" = "";
            "pet_id" = "";
            "po_number" = "";
            reason = "B.O.B";
            "rebook_id" = "";
            "recur_id" = 20954;
            "rep_id" = "";
            "room_id" = 0;
            "room_name" = "";
            service = "";
            "service_id" = 0;
            "service_time_description" = "";
            spots = 1;
            "staff_screen_name" = "John Smith";
            "staff_type_id" = 0;
            "start_time" = 540;
            "status_id" = 0;
            tip = "";
            "type_id" = 8;
            vin = "";
        }
    ),
        (
                {
            abbrev = "";
            account = "";
            "addOnService_id" = "";
            alert = "";
            "appt_id" = 1839384;
            "appt_id_unique" = 1839384;
            "appt_status_description" = "";
            "appt_status_type" = "";
            "c_id" = 47;
            cost = "0.00";
            "coupon_id" = "";
            "creation_emp_id" = 2288;
            "creation_timestamp" = 201111040717;
            "customer_id" = 0;
            "customer_notes" = "";
            "customer_package_id" = "";
            date = 20121228;
            "employee_id" = 2288;
            "employee_notes" = "";
            employer = "";
            "end_time" = 570;
            "first_name" = "";
            "history_id" = 1830959;
            key = 134;
            "last_emp_id" = 2288;
            "last_name" = "";
            "last_timestamp" = 201111040717;
            "lead_description" = "";
            "link_id" = 0;
            "location_name" = "Telephonic Setup/Training";
            "make_id" = "";
            "middle_name" = "";
            "model_id" = "";
            "model_year" = "";
            name = "My Name ";
            odometer = "";
            "other_vehicle" = "";
            "package_name" = "";
            "payment_type_description" = "";
            "payment_type_id" = "";
            "pet_id" = "";
            "po_number" = "";
            reason = "B.O.B";
            "rebook_id" = "";
            "recur_id" = 20954;
            "rep_id" = "";
            "room_id" = 0;
            "room_name" = "";
            service = "";
            "service_id" = 0;
            "service_time_description" = "";
            spots = 1;
            "staff_screen_name" = "John Smith";
            "staff_type_id" = 0;
            "start_time" = 540;
            "status_id" = 0;
            tip = "";
            "type_id" = 8;
            vin = "";
        }
    ), ... over and over again.

1 Ответ

2 голосов
/ 25 января 2012

С:

[sections addObject:rows];
[rows removeAllObjects];
[rows addObject:dict];

вы продолжаете добавлять один и тот же объект rows, а не новый, и продолжаете изменять содержимое, чтобы каждый раз отображалось последнее содержимое.

Попробуйте:

[sections addObject:[rows mutableCopy]]; 
[rows removeAllObjects];
[rows addObject:dict];

Таким образом, каждый раз добавляется новая строка.

Возможно, еще лучше:

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSMutableArray *sections = [NSMutableArray array];
NSMutableArray *rows = [NSMutableArray array];
NSString *lastDate = nil;
for (NSDictionary *dict in [json objectForKey:@"data"]) {
    NSString *date = [dict objectForKey:@"date"];
    if ([date isEqualToString:lastDate] == NO) {
        if (lastDate == nil) {
            [rows addObject:dict];
            lastDate = date;
        } else {
            [sections addObject:rows];
            rows = [NSMutableArray array];
            [rows addObject:dict];
            lastDate = date;
        }
        [rows addObject:dict];
    }
}
if (rows) {
    [sections addObject:rows];
}

self.appointments = sections;

Обратите внимание, что присвоение 0 объекту не освобождает его, release делает. Но если вы используете удобные методы для создания объектов, они автоматически высвобождаются, и для их освобождения не требуется никаких дополнительных действий.

Также обратите внимание, что при сравнении строк необходимо использовать метод isEqualToString: для сравнения содержимого, просто с помощью = или != сравнивается только адрес строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...