NSObject создается дважды - PullRequest
0 голосов
/ 03 июня 2011

Я использую следующий код для создания объекта Session и создания и добавления к нему объектов Exercise and Set.

Но теперь у меня возникает проблема, когда я добавляю упражнение к пользовательской дате (выбраноиз UIDpatePicker, а не из текущей даты), он также автоматически добавляется в сегодняшнюю сессию.Любые идеи?

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

Редактировать: Я думаю, что это потому, что упражнение добавляется к сеансу в том же методе, что и сеанс.Поэтому, хотя у упражнения может не быть набора, у Сессии все еще есть это упражнение

- (void)createSession
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat: @"(timeStamp >= %@ && timeStamp <= %@)", targetDateBegins, targetDateEnds]];
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Session" inManagedObjectContext:managedObjectContext]];

    NSError *error = nil;
    NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    NSLog(@"Fetch error: %@", error);

    if ([results count])
    {
        session = (Session *)[results objectAtIndex:0];
    }
    else
    {
        session = (Session *)[NSEntityDescription insertNewObjectForEntityForName:@"Session" inManagedObjectContext:managedObjectContext];
        session.timeStamp = self.picker.date;
    }

    NSSet *filteredExercisesFromSession=[session.exercises filteredSetUsingPredicate:[NSPredicate predicateWithFormat: @"name == %@",selectedExerciseName]];
    if ([filteredExercisesFromSession count] > 0)
    {
        self.exercise=[filteredExercisesFromSession anyObject];
    }
    else
    {
        self.exercise = (Exercise *)[NSEntityDescription insertNewObjectForEntityForName:@"Exercise" inManagedObjectContext:managedObjectContext];
        self.exercise.name = selectedExerciseName;
        [session addExercisesObject:exercise];
    }

    [fetchRequest release];
    self.fetchedResultsController = nil;
    [setsTableView reloadData];
}

-(IBAction)createSet
{    
    Set *set = (Set *)[NSEntityDescription insertNewObjectForEntityForName:@"Set" inManagedObjectContext:managedObjectContext];
    set.weight = [NSNumber numberWithFloat:weightSelected2];
    set.reps = [NSNumber numberWithInt:repSelected];
    set.timeStamp = self.picker.date;
    [self.exercise addSetsObject:set];

    NSError *error = nil;
    if (![managedObjectContext save:&error]) 
    {
        // Handle the error.
    }
    NSLog(@"error: %@", error);
    self.fetchedResultsController = nil; 
    [setsTableView reloadData];
}

Обновленный код:

- (void)createSession
{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    NSDateComponents *dateComponentsForToday = [calendar components:unitFlags fromDate:self.picker.date];
    [dateComponentsForToday setHour:0];
    [dateComponentsForToday setMinute:0];
    [dateComponentsForToday setSecond:0];
    NSDate *targetDateBegins = [calendar dateFromComponents:dateComponentsForToday]; 
    NSDate *targetDateEnds = [targetDateBegins dateByAddingTimeInterval:(60 * 60 * 24 - 1)];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat: @"(timeStamp >= %@ && timeStamp <= %@)", targetDateBegins, targetDateEnds]];
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Session" inManagedObjectContext:managedObjectContext]];
    NSLog(@"timeStamp >= %@ && timeStamp <= %@", targetDateBegins, targetDateEnds);

    NSError *error = nil;
    NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    NSLog(@"Fetch error: %@", error);

    if ([results count])
    {
        session = (Session *)[results objectAtIndex:0];
    }
    else
    {
        session = (Session *)[NSEntityDescription insertNewObjectForEntityForName:@"Session" inManagedObjectContext:managedObjectContext];
        session.timeStamp = self.picker.date;
    }

    NSSet *filteredExercisesFromSession = [session.exercises filteredSetUsingPredicate:[NSPredicate predicateWithFormat: @"name == %@",selectedExerciseName]];
    if ([filteredExercisesFromSession count] > 0)
    {
        self.exercise = [filteredExercisesFromSession anyObject];
    }

    [fetchRequest release];
    self.fetchedResultsController = nil;
    [setsTableView reloadData];
}

-(IBAction)createSet
{    
    NSSet *filteredExercisesFromSession = [session.exercises filteredSetUsingPredicate:[NSPredicate predicateWithFormat: @"name == %@",selectedExerciseName]];

    if ([filteredExercisesFromSession count] > 0)
    {
        self.exercise = [filteredExercisesFromSession anyObject];
    }
    else
    {
        NSLog(@"exercise does not already exist");
        self.exercise = (Exercise *)[NSEntityDescription insertNewObjectForEntityForName:@"Exercise" inManagedObjectContext:managedObjectContext];
        self.exercise.name = selectedExerciseName;
        self.exercise.muscleGroup = muscleName;
        [session addExercisesObject:exercise];
    }

    Set *set = (Set *)[NSEntityDescription insertNewObjectForEntityForName:@"Set" inManagedObjectContext:managedObjectContext];
    set.weight = [NSNumber numberWithFloat:weightSelected2];
    set.reps = [NSNumber numberWithInt:repSelected];
    set.timeStamp = self.picker.date;
    [self.exercise addSetsObject:set];

    NSError *error = nil;
    if (![managedObjectContext save:&error]) 
    {
        // Handle the error.
    }
    NSLog(@"error: %@", error);
    self.fetchedResultsController = nil; 
    [setsTableView reloadData];
}

1 Ответ

0 голосов
/ 03 июня 2011

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

Что мне кажется странным, это:

if ([results count])
{
    session = (Session *)[results objectAtIndex:0];
}

после выполнения выборки на основе метки времени вы получите первый результат; в противном случае вы инициализируете сеанс с self.pickerDate. Может быть, поэтому вы добавляете упражнение в сегодняшнюю сессию?

EDIT:

На мой взгляд, вполне возможно добавить упражнение к сеансу тем же способом, в котором он создан. То, что вы говорите о упражнении, назначаемом сеансу, а не набору, может быть причиной внутренней несогласованности, но не факта, что упражнение добавлено к сегодняшнему сеансу, если только между сеансами и наборами не существует какой-либо взаимосвязи, которая не является очевидно (для меня) из кода.

Как вы определяете targetDateBegins, targetDateEnds? Когда вызывается createSession, эти значения определяют, создаете ли вы новый сеанс или повторно используете существующий сеанс. Если вы повторно используете существующий сеанс, его дата уже установлена, а средство выбора игнорируется.

Предложение: установите точку останова в начале createSession и отладьте свою программу, чтобы вы могли точно видеть, что происходит в createSession, и понимать, выбран ли ожидаемый путь или программа делает то, чего вы не делали ожидать.

...