2015-08-05 1 views
1

que je développe une application pour iPhone et je suis bloqué à ce point:Groupe NSDate semaines et l'ordre du plus récent au plus ancien

je reçois ces données à partir d'un objet:

{ 
    date = "2014-08-04 11:21:26 +0000"; 
    idChallenger = "-1"; 
    index = "-1"; 
    time = "-1"; 
}, 
    { 
    date = "2015-07-31 14:50:40 +0000"; 
    idChallenger = 43; 
    index = "-1"; 
    time = "-1"; 
}, 
    { 
    date = "2015-07-31 16:18:57 +0000"; 
    idChallenger = "-1"; 
    index = "-1"; 
    time = "-1"; 
}, 
    { 
    date = "2015-07-31 16:19:29 +0000"; 
    idChallenger = "-1"; 
    index = "-1"; 
    time = "-1"; 
}, 
    { 
    date = "2015-08-04 15:25:26 +0000"; 
    idChallenger = "-1"; 
    index = "-1"; 
    time = "-1"; 
} 

maintenant Je devrais obtenir toute la date, groupe par semaines et tri du plus récent au plus vieux ...

En ce moment je suis bloqué à comment NSDate de groupe par semaines, le problème commence quand il y a plus d'années dans la date, parce que par exemple le premier élément de la structure est groupé par le dernier élément.

comment puis-je faire? Merci

EDIT:

c'est le code que j'utilise pour groupe par semaine:

NSMutableArray *weekArray = [NSMutableArray array]; 
for (int i = 0; i<52; i++) { 

    [weekArray addObject:[NSMutableArray array]]; 
} 


for (int i = 0; i<_array.count; i++) { 

    NSDictionary *dict = [_array objectAtIndex:i]; 

    NSDate *date = [dict objectForKey:@"date"]; 

    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear | NSCalendarUnitWeekOfYear fromDate:date]; 

    NSMutableArray *innerArray = weekArray[[dateComponents weekOfYear] -1]; 
    [innerArray addObject:dict]; 
} 

for (int i = 0; i<weekArray.count; i++) { 

    if ([[weekArray objectAtIndex:i] count] > 0) { 

     NSNumber *iNum = [NSNumber numberWithInt:i+1]; 

     [_mutableDictionary setObject:[weekArray objectAtIndex:i] forKey:iNum]; 
    } 
} 

_mutableDictionary est:

31 =  (
      { 
     date = "2015-07-31 16:19:29 +0000"; 
     idChallenger = "-1"; 
     index = "-1"; 
     time = "-1"; 
    }, 
      { 
     date = "2015-07-31 16:19:23 +0000"; 
     idChallenger = "-1"; 
     index = "-1"; 
     time = "-1"; 
    }, 
      { 
     date = "2015-07-31 16:18:57 +0000"; 
     idChallenger = "-1"; 
     index = "-1"; 
     time = "-1"; 
    }, 
      { 
     date = "2015-07-31 14:50:40 +0000"; 
     idChallenger = 43; 
     index = "-1"; 
     time = "-1"; 
    } 
); 
32 =  (
      { 
     date = "2015-08-04 15:25:26 +0000"; 
     idChallenger = "-1"; 
     index = "-1"; 
     time = "-1"; 
    }, 
      { 
     date = "2014-08-04 11:22:40 +0000"; 
     idChallenger = 43; 
     index = "-1"; 
     time = "-1"; 
    } 
); 

31 et 32 ​​sont numéro de la semaine année

Je pense que cela est mauvais pour mon but ...

Après groupe cette NSDate de la bonne manière, il faut avoir une structure qui me permettent de créer la section n dans UITableView pour chaque semaine

+1

Mettez à jour votre question avec votre code pertinent. Montrer une tentative. – rmaddy

+0

Qu'entendez-vous par "groupe"? Mettre celui dans la même semaine dans un autre 'NSArray', un' NSDictionary'? À quoi ressembleront vos données à la fin? – Larme

+2

1) Ne présumez pas 52 semaines dans une année. Une année en compte 53 (la dernière étant partielle bien sûr). 2) Votre besoin de regrouper par année et semaine de l'année, pas seulement la semaine de l'année. – rmaddy

Répondre

4

Vous devez à la base le regroupement sur l'année et la semaine de l'année. Vous devez également éviter de coder en dur 52 tableaux vides. Au lieu de cela, utilisez un dictionnaire de tableaux où la clé représente l'année et la semaine et la valeur est le tableau.

Essayez quelque chose comme ceci:

NSMutableDictionary *weeksDictionary = [NSMutableDictionary dictionary]; 

NSCalendar *calendar = [NSCalendar currentCalendar]; 
for (NSDictionary *dict in _array) { 
    NSDate *date = [dict objectForKey:@"date"]; 
    NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear | NSCalendarUnitWeekOfYear fromDate:date]; 
    NSInteger year = dateComponents.year; 
    NSInteger week = dateComponents.weekOfYear; 
    NSInteger index = year * 100 + week; 
    NSNumber *key = @(index); 
    NSMutableArray *weekArray = weeksDictionary[key]; 
    if (!weekArray) { 
     weekArray = [NSMutableArray array]; 
     weeksDictionary[key] = weekArray; 
    } 
    [weekArray addObject:dict]; 
} 

Cela vous donne un tableau pour chaque année/semaine qui a une date. Pour utiliser ceci avec la vue tabulaire, triez les clés du dictionnaire pour obtenir un tableau de valeurs de l'année/de la semaine dans l'ordre. Ensuite, vous pouvez diviser chaque clé pour obtenir l'année et la semaine:

NSNumber *key = sortedKeysArray[indexPath.section]; 
NSInteger value = key.integerValue; 
NSInteger year = value/100; 
NSInteger week = value % 100; 
+0

merci l'homme !! Je voudrais upvote plus de fois !!! – Ilario