【发布时间】:2014-07-20 20:54:26
【问题描述】:
我想在“Day”中保持正确的 emoAvg。以下是我希望完成的工作:
- 每当“情绪”与 “一天”……一天可以有很多情绪。
- 每当从“Day”中删除“Emotion”时,更新“Day”的 emoAvg
- 每当“Emotion”的情绪属性发生变化时,更新“Day”的 emoAvg。
我想将所有这些代码保留在模型层中,并且我已经能够通过调用以下代码将情绪与日子联系起来,该代码在创建情绪时将日子附加到情绪上。
我无法为“Day”与“Emotion”的一对多关系编写自定义访问器。我被困在 Xcode 4.6.2 中,并且此版本中似乎不存在复制/粘贴自定义 ObjectiveC 访问器功能。
构建此代码的好方法是什么?
- (void)setDate:(NSDate *)date
{
[self willChangeValueForKey:@"date"];
[self setPrimitiveValue:date forKey:@"date"];
[self associateDay];
[self didChangeValueForKey:@"date"];
}
-(void)associateDay
{
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:self.date];
//Start of Day
[dateComponents setHour:0];
[dateComponents setMinute:0];
[dateComponents setSecond:0];
NSDate *startOfDay = [calendar dateFromComponents:dateComponents];
//NSLog(@"Start of Day: %@", [dateFormatter stringFromDate:startOfDay]);
//End of Day
[dateComponents setHour:23];
[dateComponents setMinute:59];
[dateComponents setSecond:59];
NSDate *endOfDay = [calendar dateFromComponents:dateComponents];
//NSLog(@"End of Day: %@", [dateFormatter stringFromDate:endOfDay]);
//Find all Day Entities that fall on the same calendar date
NSPredicate *datePredicate = [NSPredicate predicateWithFormat:@"date > %@ AND date < %@", startOfDay, endOfDay];
NSFetchRequest *fetchDays = [[NSFetchRequest alloc]initWithEntityName:@"Day"];
fetchDays.predicate = datePredicate;
NSManagedObjectContext *context = [(id)[UIApplication sharedApplication].delegate managedObjectContext];
NSArray *daysFound = [context executeFetchRequest:fetchDays error:nil];
if ([daysFound count] == 1)
{
Day *dayWithMatchingDate = [daysFound objectAtIndex:0];
self.day = dayWithMatchingDate;
NSLog(@"Found %d matching days",[daysFound count]);
}
if ([daysFound count] > 1)
{
NSLog(@"Found %d matching days...Something needs fixing",[daysFound count]);
}
if ([daysFound count] < 1)
{
NSLog(@"Found %d matching days...Making a new Day and associating it",[daysFound count]);
NSManagedObjectContext *context = [(id)[UIApplication sharedApplication].delegate managedObjectContext];
Day *newDay = [NSEntityDescription insertNewObjectForEntityForName:@"Day" inManagedObjectContext:context];
newDay.date = self.date;
self.day = newDay;
}
}
【问题讨论】: