Проблемы с производительностью при поиске рабочих дней за определенный период - PullRequest
1 голос
/ 14 мая 2010

У меня есть несколько методов, которые возвращают количество дней недели между двумя указанными датами. Поскольку вызов этих методов становится очень дорогим, когда эти две даты лежат на расстоянии нескольких лет, мне интересно, как эти методы могут быть реорганизованы более эффективным способом. Возвращенный результат верный, но я чувствую, что процессор iphone изо всех сил старается не отставать и, следовательно, останавливает приложение, когда я вызываю эти методы в течение, скажем, 10 лет. Есть предложения?

    //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;
    }

Ответы [ 2 ]

0 голосов
/ 06 октября 2010

Почему бы не взглянуть на основные базовые классы, которые обрабатывают даты?

CFAbsoluteTimeGetDayOfWeek Возвращает целое число, представляющее день недели, указанный указанным абсолютным временем.

SInt32 CFAbsoluteTimeGetDayOfWeek ( CFAbsoluteTime at, CFTimeZoneRef tz );

Параметры at: абсолютное время для конвертации. tz: часовой пояс, используемый для коррекции времени. Передайте NULL для GMT.

Возвращаемое значение: Целое число (1-7), обозначающее день недели, указанный в at. Согласно ISO-8601, понедельник представлен 1, вторник - 2 и т. Д.

Доступность Доступный в iOS 2.0 и позже. Объявлен в CFDate.h

Больше информации можно найти по адресу: http://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFDatesAndTimes/

0 голосов
/ 14 мая 2010

Вам нужно создать формулу для расчета количества дней недели, а не для циклического анализа по дням и их подсчета.

Примерно так (это грубое приближение), где startJD и endJD - это юлианские даты :

nWeekdays = (endJD - startJD) * 5 / 7;  

Конечно, это близко, но не точно, поскольку не учитывается, в какой день недели он начинается и заканчивается. Но это общая идея, вам нужна формула, а не цикл.

Вы также можете найти немножко в этой теме, выполнив поиск .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...