我有一些方法可以返回两个给定日期之间的工作日数。因为当两个日期相隔数年时调用这些方法变得非常昂贵,所以我想知道如何以更有效的方式重构这些方法。
返回的结果是正确的,但是当我在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/

10-15 12:57