我有一些方法可以返回两个给定日期之间的工作日数。因为当两个日期相隔数年时调用这些方法变得非常昂贵,所以我想知道如何以更有效的方式重构这些方法。
返回的结果是正确的,但是当我在10年内调用这些方法时,我认为iphone处理器正努力跟上进展,因此冻结了应用程序。
有什么建议么 ?
//daysList contains all weekdays that need to be found between the two dates
-(NSInteger) numberOfWeekdaysFromDaysList:(NSMutableArray*) daysList
startingFromDate:(NSDate*)startDate
toDate:(NSDate*)endDate
{
NSInteger retNumdays = 0;
for (Day *dayObject in [daysList objectEnumerator])
{
if ([dayObject isChecked])
{
retNumdays += [self numberOfWeekday:[dayObject weekdayNr] startingFromDate:startDate toDate:endDate];
}
}
return retNumdays;
}
-(NSInteger) numberOfWeekday:(NSInteger)day
startingFromDate:(NSDate*)startDate
toDate:(NSDate*)endDate
{
NSInteger numWeekdays = 0;
NSDate *nextDate = startDate;
NSComparisonResult result = [endDate compare:nextDate];
//Do while nextDate is in the past
while (result == NSOrderedDescending || result == NSOrderedSame)
{
if ([NSDate weekdayFromDate:nextDate] == day)
{
numWeekdays++;
}
nextDate = [nextDate dateByAddingDays:1];
result = [endDate compare:nextDate];
}
return numWeekdays;
}
最佳答案
您需要创建一个公式来计算工作日的数量,而不是每天循环计算并计算它们。
像这样(这是一个近似值),其中startJD和endJD是Julian Dates:
nWeekdays = (endJD - startJD) * 5 / 7;
当然这是接近的,但并不确切,因为它没有考虑到它在一周的哪一天开始和结束。但这是一般的想法,您需要一个公式,而不是一个循环。
您还可以在this topic by searching上找到很多内容。
关于iphone - 查找给定期间的工作日的性能问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2830922/