2012-04-11 19 views
0

Ich arbeite an einem Projekt, das den Zeitunterschied von einem ersten Startdatum überprüfen muss. Ich benutze die NSDayCalendarUnit und NSWeekCalendarUnit. Grundsätzlich möchte ich für die ersten 2 Wochen an jedem zweiten Tag etwas performen. Das Objekt, das ich verwende, muss für jeweils zwei Tage in einem bestimmten Zustand sein.NSDate-Einheiten und Berechnungen

So zum Beispiel

Day 1 & 2, Week 0 - State 1 
Day 3 & 4, Week 0 - State 2 
... 
Day 1 & 2, Week 1 - State 8 
Day 3 & 4, Week 1 - State 9 

Hier ist mein Code:

// get the data/time difference from the first launch 
    int daysDifferent = [[dateDifferenceInfo objectForKey:@"days"] intValue]; 
    int weeksDifferent = [[dateDifferenceInfo objectForKey:@"weeks"] intValue]; 

    if(daysDifferent == 2 | daysDifferent == 3 && !weeksDifferent && _dot.age != 2){ 
     // set state 
    } 

    if(daysDifferent == 4 | daysDifferent == 5 && !weeksDifferent && _dot.age != 3){ 
     // set state 
    } 
    if((daysDifferent == 6 && weeksDifferent == 0 | daysDifferent == 0 && weeksDifferent == 1) && _dot.age != 4){ 
     // set state 
    } 

    if(daysDifferent == 0 | daysDifferent == 1 && weeksDifferent == 1 && _dot.age != 5){ 
     // set state 
    } 

    if(daysDifferent == 2 | daysDifferent == 3 && weeksDifferent == 1 && _dot.age != 6){ 
     // set state 
    } 

    if(daysDifferent == 4| daysDifferent == 5 && weeksDifferent == 1 && _dot.age != 7){ 
     // set state 
    } 

    if((daysDifferent == 6 && weeksDifferent == 1 | daysDifferent == 0 && weeksDifferent == 2) && _dot.age != 8){ 
     // set state 
    } 

    if(weeksDifferent >= 2 && !(daysDifferent % 2)){ 
     // set state 
    } 

Randbemerkung: Ich weiß, es ist schlechter Code, ich plane, diese Fälle mit dem Schalter zu ersetzen, ich brauche nur zu sortier Logik zuerst.

Meine Frage ist, gibt es eine bessere Möglichkeit, diese Art von Muster zu berechnen?

Antwort

0

Ich bin mir nicht ganz klar, auf Ihrem Ziel, wie Sie sagen:

für die ersten 2 Wochen an jedem zweiten Tag, als ich etwas ausführen möchte.

So zum Beispiel

Day 1 & 2, Week 0 - State 1 
Day 3 & 4, Week 0 - State 2 
... 
Day 1 & 2, Week 1 - State 8 
Day 3 & 4, Week 1 - State 9 

Wo ich hätte gedacht, wäre es

sein
Day 1 & 2, Week 0 - State 1 
Day 3 & 4, Week 0 - State 2 
Day 5 & 6, Week 0 - State 3 
Day 7 Week 0 & Day 1 Week 1 - State 4. 
... 

Also, wenn Ihr Beispiel richtig ist, wird die Berechnung unterschiedlich ist.

Basierend auf dem einfacheren Beispiel, würde ich das Zeitintervall seit dem ersten Datum berechnen und dividieren durch die doppelte Länge eines Tages, wobei das Wort angenommen wird. Das ist der Zustand:

NSDate *firstDate = ... 
NSDate *secondDate = ... 
NSTimeInterval interval = [ secondDate timeIntervalSinceDate: firstDate ]; 
double secondsPerDay = 60 * 60 * 24.0; // s per min times min per hr times hrs per dy. 
int state = (int) (interval/secondsPerDay * 0.5) + 1; 

Wenn auf der anderen Seite, es ist wirklich, wie Sie beschrieben haben, ist der Ansatz würde ich so schnell bedienen und einfach wäre, eine ähnliche Berechnung zu tun - Weglassen der 0,5-Faktor in die letzte Zeile, und dann eine einfache Lookup-Tabelle verwenden, um den Zustand von Tag zu bekommen:

int table[ 14 ] = { 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8 }; 
int state = table[ (int) (interval/secondsPerDay) ]; 
+0

Danke, ich sehe, was Sie meinen, aber nach den ersten zwei Wochen der Zustand ändert sich nicht und es bleibt auf dem letzten bekannter Zustand (Woche 2, Tag 0). – Peter

+0

Anstatt die Tabellensuche wie gezeigt durchzuführen, überprüfen Sie zunächst, ob der Quotient größer als 13 ist. Wenn dies der Fall ist, setzen Sie es auf 14 und führen Sie dann die Tabellensuche durch (mit einem 14. Element in der Tabelle mit dem Wert 9). – DRVic

+0

Ahh ich sehe! Wow danke für deine Hilfe. Viel netterer Code - gibt es eine Möglichkeit für mich, das auszuprobieren, ohne tagelang warten zu müssen? – Peter