Основные данные: Добавление объектов из NSMutableArray в NSMutableSet? - PullRequest
0 голосов
/ 27 июля 2011

Судя по количеству смежных вопросов, которые были подняты, это выглядит как часто задаваемый вопрос, который делает меня все более нерешительным задавать его. Я рассмотрел большинство этих вопросов, но ни один из них, похоже, не решает конкретную проблему, с которой мне трудно разобраться.

Небольшая справочная информация о том, чего я пытаюсь достичь, как я это делаю и какая у меня проблема:

Я пытаюсь проанализировать веб-службу XML, загрузить эти данные в NSMutableArray (или в любое другое место, откуда я могу получить к нему доступ позже), а затем взять мои данные и загрузить их в мою модель базовых данных. Первая часть этого я могу сделать, когда у меня есть информация в массиве, и я пытаюсь загрузить ее в базовые данные, которые, похоже, не могут прогрессировать.

Моя модель (упрощенная для этого вопроса) состоит из объекта маршрута, который имеет отношение один ко многим с объектом контрольной точки. Данные, которые я буду пытаться загрузить, представляют собой разнообразную информацию об атрибутах в моем объекте маршрута, который не включен в мой массив, а затем в мой список контрольных точек, которым является этот массив. Моя проблема в том, что я не могу надежно добавить весь свой массив контрольных точек и затем сохранить. Для статического случая, который я использую для разработки, у меня есть 20 проверенных контрольных точек, которые были проанализированы в моем NSMutableArray, из них самое большее, что я смог перенести в свой NSMutableSet, то есть часть контрольных точек моего объекта маршрута, - это 7 до сбоя с любой из них. SIGABRT, или EXC_BAD ACCESS, или неверный селектор отправлен. Я пытался выяснить это для большей части сегодняшнего дня без удачи. Теперь немного кода:

NSManagedObjectContext *context = [appDelegate managedObjectContext];

    //newRoute is the route that I am trying to create and then store persistently
    newRoute = [NSEntityDescription insertNewObjectForEntityForName:@"Route" inManagedObjectContext:context];

    //filling in some available attribute information
    if (name.text == @"")
        [newRoute setValue:[NSDate date] forKey:@"name"];
    else
        [newRoute setValue:name.text forKey:@"name"];

    NSMutableSet *muteSet = [newRoute mutableSetValueForKey:@"myCheckpoints"];

    for (int i = 0; i < [appDelegate.checkpoints count]; i++ )
    {
        Checkpoint *newCheckpoint = [[Checkpoint alloc] init];
        [newCheckpoint setName:[[appDelegate.checkpoints objectAtIndex:i] valueForKey:@"name"]];

        NSLog(@"Appending %@ to set", newCheckpoint.name);
        [muteSet addObject:newCheckpoint];

        [newCheckpoint release];
    }

    //myCheckpoints is the route<-->>checkpoints relationship 
    [newRoute setValue:muteSet forKey:@"myCheckpoints"];

    // Save the context.
    NSError *error = nil;
    if (![context save:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

Из любопытства, почему не работает следующее?

NSSet *ckPtSet = [[NSSet alloc] initWithArray:appDelegate.checkpoints];     
[newRoute setValue:ckPtSet forKey:@"myCheckpoints"];

Насколько я понимаю, и это может быть там, где проблема ... при установке значения myCheckpoints, ожидание должно быть передано NSSet. При работе с отладчиком инициализированный набор на самом деле содержит 20 объектов, но когда я пытаюсь пройти мимо, я снова получаю неверный селектор, получивший ошибку.

В любом случае, спасибо, что нашли время, чтобы прочитать мою стену текста, если вам нужна дополнительная помощь, пожалуйста, дайте мне знать, и я добавлю это как можно скорее! -Karoly

1 Ответ

1 голос
/ 27 июля 2011

Документация для [id<NSKeyValueCoding> mutableSetValueForKey:] гласит, что она возвращает изменяемый прокси-набор, который обеспечивает доступ для чтения-записи для неупорядоченного отношения ко-многим, заданного данным ключом. Это означает, что возвращаемый объект не является ' Обязательно NSMutableSet экземпляр как таковой, но прокси, в котором любые изменения, которые вы вносите в этот объект, отражаются в самом наборе вашей модели.

Возможно, именно поэтому [newRoute setValue:muteSet forKey:@"myCheckpoints"]; доставляет вам неприятности. Я считаю, что лучший способ думать об этом - это не иметь промежуточный объект, а вложенные вызовы, например ::

[[newRoute mutableSetValueForKey:@"myCheckpoints"] addObject:newCheckpoint];
...