Iphone 从NSDictionary返回NSArray
我有一个fetch,它返回一个数组,其中包含核心数据对象属性的字典 这是我先前的问题: 这是提取:Iphone 从NSDictionary返回NSArray,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我有一个fetch,它返回一个数组,其中包含核心数据对象属性的字典 这是我先前的问题: 这是提取: NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entity]; [request setResultType:NSDictionaryResultType]; [request setReturnsDistinctResults:NO]; //set to YES if you only wa
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];
当我记录NSArray数据时,我得到以下信息:
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";
}
)
我想要的是一个具有以下格式的数组:
[NSArray arrayWithObjects: @"2011-11-01 00:00:00 +0000", @"2011-12-01 00:00:00 +0000", nil];'
编辑:
这是我想用新数据数组替换数据数组的方法:
- (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];
}
快速枚举法:
NSMutableArray *data = [[NSMutableArray alloc] initWithCapacity:array.count];
for (NSDictionary *d in objects) {
[data addObject:[d objectForKey:@"timeStamp"]];
}
方法:
无论哪种方式,“data”都只包含一个NSDate实例数组。调用从fetch请求返回的数组对象。这将依次调用每个对象上的valueForKey
,并返回所有结果值的数组
NSArray *timestamps = [objects valueForKey:@"timeStamp"];
要获得所需的数组类型,可以执行以下操作:
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];
NSMutableArray*array=[[NSMutableArray alloc]init];
对于(int n=0;n<[数据计数];n++)//数据数组
{
NSMUTABLEARRY*array=[[NSMUTABLEARRY alloc]init];
数组=[NSMutableArray arrayWithObjects:[[data objectAtIndex:n]valueForKey:@“timeStamp”],nil];
如果([数组计数]!=0){
[newArray addObject:[array objectAtIndex:0]];
}
}
[阵列释放];
希望这对你有帮助
~Manoj太棒了。我喜欢KVC,每天都能学到一些新的东西。谢谢Anurag。但是由于某些原因,数据仍然没有加载我的日历视图。这是一张显示2个阵列的图片,底部的一个加载数据很好,并与示例应用程序一起提供。最上面的是我的,不加载数据。是不是因为我的时间戳必须是000000?实际上,我刚刚发布了上面的方法,这个数组就是其中的一部分。也许有些东西我可以改变,所以时间0000000与时间戳中的时间没有什么区别?@ RYANR -KVC给可可提供了一个非常坚实的基础。我喜欢其他一些语言使用map
、reduce、
过滤器处理集合的方式。例如,在Ruby中,等价物是,timestamps=objects.map{{| object | object[:timestamp]}
。希望Cocoa能将这些方法合并到NSArray中,也许其他语言也会采用KVC。一厢情愿:)@Anurag:到目前为止,除了你刚才演示的,我最喜欢的是。在一行代码中对一个集合执行函数简直太棒了。你能检查一下我发布的另一个答案中的注释,看看你知道发生了什么吗?谢谢。@Jon,我不知道你的意思,我在你的另一个问题或这个问题的其他地方没有看到任何新的评论。你能澄清一下吗?根据Anurag提供的答案,我们正在讨论一个我们无法解决的问题。
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];