2012-10-24 48 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