2010-05-13 3 views
1

У меня есть несколько методов, которые возвращают количество будних дней между двумя заданными датами. Поскольку вызов этих методов становится очень дорогим для вызова, когда две даты лежат годами, мне интересно, как эти методы могут быть реорганизованы более эффективным способом. Вернувшийся результат верен, но я чувствую, что процессор 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; 
    } 

ответ

0

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

Нечто подобное (это грубое приближение), где startJD и endJD являются Julian Dates:

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

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

Вы также можете найти немало на this topic by searching.

0

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

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

SInt32 CFAbsoluteTimeGetDayOfWeek ( CFAbsoluteTime на, CFTimeZoneRef TZ );

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

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

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

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

Смежные вопросы