2 Stimmen

NSArray aus NSDictionary zurückgeben

Ich habe eine Abfrage, die ein Array mit Wörterbuch in es eines Attributs eines Kerndatenobjekts zurückgibt.

Hier ist meine vorherige Frage: Array aus Attribut von NSObject von NSFetchResultsController erstellen

Dies ist der Abruf:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctResults:NO]; //set to YES if you only want unique values of the property
[request setPropertiesToFetch :[NSArray arrayWithObject:@"timeStamp"]]; //name(s) of properties you want to fetch

// Execute the fetch.
NSError *error;
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];

Wenn ich das NSArray protokolliere data Ich verstehe das:

The content of data is(
        {
        timeStamp = "2011-06-14 21:30:03 +0000";
    },
        {
        timeStamp = "2011-06-16 21:00:18 +0000";
    },
        {
        timeStamp = "2011-06-11 21:00:18 +0000";
    },
        {
        timeStamp = "2011-06-23 19:53:35 +0000";
    },
        {
        timeStamp = "2011-06-21 19:53:35 +0000";
    }
)

Ich möchte ein Array mit diesem Format:

[NSArray arrayWithObjects: @"2011-11-01 00:00:00 +0000", @"2011-12-01 00:00:00 +0000", nil];'

編集する。

Dies ist die Methode, bei der ich das Datenfeld durch mein neues Datenfeld ersetzen möchte:

- (NSArray*)calendarMonthView:(TKCalendarMonthView *)monthView marksFromDate:(NSDate *)startDate toDate:(NSDate *)lastDate {    
    NSLog(@"calendarMonthView marksFromDate toDate");   
    NSLog(@"Make sure to update 'data' variable to pull from CoreData, website, User Defaults, or some other source.");
    // When testing initially you will have to update the dates in this array so they are visible at the
    // time frame you are testing the code.
    NSArray *data = [NSArray arrayWithObjects:
                     @"2011-01-01 00:00:00 +0000", @"2011-12-01 00:00:00 +0000", nil]; 

    // Initialise empty marks array, this will be populated with TRUE/FALSE in order for each day a marker should be placed on.
    NSMutableArray *marks = [NSMutableArray array];

    // Initialise calendar to current type and set the timezone to never have daylight saving
    NSCalendar *cal = [NSCalendar currentCalendar];
    [cal setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

    // Construct DateComponents based on startDate so the iterating date can be created.
    // Its massively important to do this assigning via the NSCalendar and NSDateComponents because of daylight saving has been removed 
    // with the timezone that was set above. If you just used "startDate" directly (ie, NSDate *date = startDate;) as the first 
    // iterating date then times would go up and down based on daylight savings.
    NSDateComponents *comp = [cal components:(NSMonthCalendarUnit | NSMinuteCalendarUnit | NSYearCalendarUnit | 
                                                    NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSSecondCalendarUnit) 
                                          fromDate:startDate];
    NSDate *d = [cal dateFromComponents:comp];

    // Init offset components to increment days in the loop by one each time
    NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
    [offsetComponents setDay:1];    

    // for each date between start date and end date check if they exist in the data array
    while (YES) {
        // Is the date beyond the last date? If so, exit the loop.
        // NSOrderedDescending = the left value is greater than the right
        if ([d compare:lastDate] == NSOrderedDescending) {
            break;
        }

        // If the date is in the data array, add it to the marks array, else don't
        if ([data containsObject:[d description]]) {
            [marks addObject:[NSNumber numberWithBool:YES]];
        } else {
            [marks addObject:[NSNumber numberWithBool:NO]];
        }

        // Increment day using offset components (ie, 1 day in this instance)
        d = [cal dateByAddingComponents:offsetComponents toDate:d options:0];
    }

    [offsetComponents release];

    return [NSArray arrayWithArray:marks];
}

5voto

Anurag Punkte 136648

Rufen Sie an. valueForKey auf das von der Abrufanfrage zurückgegebene Array-Objekt. Das wiederum ruft valueForKey für jedes Objekt und geben ein Array mit allen resultierenden Werten zurück.

NSArray *timestamps = [objects valueForKey:@"timeStamp"];

2voto

RyanR Punkte 7700

Die Methode der schnellen Aufzählung:

NSMutableArray *data = [[NSMutableArray alloc] initWithCapacity:array.count];
for (NSDictionary *d in objects) {
  [data addObject:[d objectForKey:@"timeStamp"]];
}

Le site Block Zähler Methode:

NSMutableArray *data = [[NSMutableArray alloc] initWithCapacity:array.count];
[objects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  [data addObject:[obj objectForKey:@"timeStamp"]];
}];

In jedem Fall enthält "data" nur ein Array von NSDate-Instanzen.

0voto

Manoj Punkte 913

Um den gewünschten Array-Typ zu erhalten, können Sie etwa so vorgehen:

NSMutableArray *array = [[NSMutableArray alloc] init];
for (int n = 0; n < [data count]; n++) // data array 
 {  
    NSMutableArray *array = [[NSMutableArray alloc] init];
    array = [NSMutableArray arrayWithObjects:[[data objectAtIndex:n] valueForKey:@"timeStamp"] ,nil];
   if ([array count] != 0) {
    [newArray addObject:[array objectAtIndex:0]];
    }
  }
 [array release];

Ich hoffe, das hilft Ihnen!!

~Manoj

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X