【问题标题】:OO Design & Core Data: Where to put aggregate calculation method?OO Design & Core Data:聚合计算方法放在哪里?
【发布时间】:2012-10-24 14:21:27
【问题描述】:

我有一个NSManagedObject company,其属性为(NSString*) name(NSDate*) lastAvailableInterim

我想根据以下代码示例计算一组公司 (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 是否有意义?

谢谢!

【问题讨论】:

  • 我怀疑它应该进入模型。
  • 从mvc的角度来看,你应该把它做成一个模型。正如雷所说。 self.companies 应该是方法的“companies”参数。

标签: objective-c ios oop core-data


【解决方案1】:

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

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

【讨论】:

  • 你的意思是添加一个像+ (NSDate*)lastReportedInterimFor:(NSArray*)companiesNSManagedObject *company这样的类方法?关于使用 NSFetchRequest 获取正确日期的好点,但是如何在获取请求中评估日期的月份?
  • 您可以创建一个日期为上个月的最后一个日期和下个月的第一个日期,并查找日期介于这两个日期之间的公司。该方法看起来像这样 + (NSDate*)lastReportedInterim;由于您要返回日期,因此您可以在该类方法中创建一个 NSManagedObjectContext 来进行获取。这样,该方法可以安全地从不同的线程中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多