2012-10-24 49 views
0

我有一个NSManagedObject company与属性(NSString*) name(NSDate*) lastAvailableInterimOO设计与核心数据:何处放置计算方法?

我想计算汇总值公司的阵列(NSArray *companies),例如相当于基于下面的代码示例一季度末的最后报告日期:

- (NSDate*)latestAvailableInterimFor:(NSArray*)companies 
{ // returns the maximum interim report date for all companies in the selection, date has to have end month = quarter end 
    NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar]; 
    __block NSDate *maxLatestAvailableInterim; 

    [self.companies enumerateObjectsUsingBlock:^(IBCompany *company, NSUInteger idx, BOOL *stop) { 
     NSDateComponents *monthComponents = [gregorian components:NSMonthCalendarUnit fromDate:company.latestAvailableInterim]; 
     NSAssert((company.latestAvailableInterim),@"LatestAvailableInterim must be <> NIL!"); 
     NSInteger month = [monthComponents month]; 
     if (month % 3 == 0) maxLatestAvailableInterim = MAX(maxLatestAvailableInterim, company.latestAvailableInterim); 
    }]; 
    return maxLatestAvailableInterim; 
} 

面向对象的角度和基于MVC方案,我会在哪里放这个代码?

在处理结果值或“接近”(NSManagedObject*) company子类的视图控制器中,或者将它添加到NSArray的类别是否有意义?

谢谢!

+0

我怀疑它应该在模型中。 –

+0

从mvc的角度来看,你应该把它变成一个模型。正如雷说的那样。 self.companies应该是该方法的“公司”参数。 –

回答

1

不是NSArray的一个分类。您可以向接收NSManagedObjectContext的IBCompany类添加一个类方法,并使用它来执行提取以找到您正在查找的正确日期。尝试通过NSFetchRequest找到正确的日期,而不是进行内存检查。

您也可以在处理结果信息的视图控制器中执行此操作。

+0

你的意思是像'+(NSDate *)lastReportedInterimFor:(NSArray *)companies'to'NSManagedObject * company'那样添加一个类方法?关于使用'NSFetchRequest'获取正确的日期的好处,但是我怎么能在一个获取请求中评估一个日期的月份呢? – AlexR

+0

您可以创建上个月的最后一个日期和下个月的第一个日期的日期,并找到这些日期之间的日期的公司。该方法看起来像这样+(NSDate *)lastReportedInterim;既然你正在返回一个日期,你可以在该类的方法内部创建一个NSManagedObjectContext来执行抓取。这样,该方法可以安全地从不同的线程使用。 – J2theC

+0

谢谢你的多线程提示! – AlexR