我的问题是:如何在 iOS 中的特定日期和时间加载特定图像?
我已经搜索了网络,但没有找到任何有用的东西。
我在 imageArray 中有一个图像列表,并希望每个图像都在特定的日期、时间和顺序显示。
外汇。说我想在 MyDateAndTime 上加载 MyImage。我怎样才能做到这一点?
图 1 - DateAndTime 1 图 2 - DateAndTime 2 图 3 - DateAndTime 3
任何建议表示赞赏,如果可能,请提供一些源代码。
我的问题是:如何在 iOS 中的特定日期和时间加载特定图像?
我已经搜索了网络,但没有找到任何有用的东西。
我在 imageArray 中有一个图像列表,并希望每个图像都在特定的日期、时间和顺序显示。
外汇。说我想在 MyDateAndTime 上加载 MyImage。我怎样才能做到这一点?
图 1 - DateAndTime 1 图 2 - DateAndTime 2 图 3 - DateAndTime 3
任何建议表示赞赏,如果可能,请提供一些源代码。
我提出了简单的逻辑,根据您的要求进行编辑,否则如果您对我的回答有任何疑问,请告诉我。
最好的方法是使用日期时间(dd_MM_yyyy_HH_mm_ss
)的名称存储您的图像并访问图像名称,例如,
NSString *imageName
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"dd_MM_yyyy_HH_mm_ss"];
imageName = [NSString stringWithFormat:@"%@.png", [formatter stringFromDate:[NSDate date]]]; // here you can set specific dateTime, i putted current dateTime
在这里你会得到imageName
像19_10_2013_6_13_21.png
通过这个图像名称,您可以从包或文档目录中获取图像。
如果您只想每分钟显示一张不同的图像,请使用此功能,否则请跳过下方以查看有用的日期信息。
NSTimeInterval secondsInMinute = 60;
[NSTimer timerWithTimeInterval:secondsInMinute target:self selector:@selector(minuteChanged:) userInfo:nil repeats:YES];
- (void)minuteChanged:(id)sender {
// change image here
}
你的问题可能有很多不同的答案,你想动态创建这个日期吗?或者它是一个预定义的日期?一种解决方案是获取您要查找的日期的时间间隔。
NSDate* rightNow = [NSDate date];
NSTimeInterval timeInterval = [rightNow timeIntervalSince1970];
// since time intervals are in seconds we can just append the
// date as easily as adding time
NSInteger secondsInMinute = 60;
NSInteger minutesInHour = 60;
NSInteger hoursInDay = 24;
NSInteger daysInWeek = 7;
NSInteger secondsInWeek = secondsInMinute * minutesInHour * hoursInDay * daysInWeek;
timeInterval = timeInterval + secondsInWeek;
NSDate* aWeekInFuture = [NSDate dateWithTimeIntervalSince1970:timeInterval];
我想说的是设置日期最容易理解,但您也可以使用组件来动态设置未来日期。这会导致一些问题,但这是如何完成的。
NSDate* rightNow = [NSDate date];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* dateCompenents = [calendar components:(NSDayCalendarUnit | NSWeekCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:rightNow];
[dateCompenents setDay:dateCompenents.day + 7];
NSDate* aWeekInFuture = [calendar dateFromComponents:dateCompenents];
为了帮助解释这一点,这里是一些控制台日志
(lldb) po rightNow
$0 = 0x0b933440 2013-10-19 12:43:55 +0000
(lldb) po aWeekInFuture
$1 = 0x0ba32a60 2013-10-26 04:00:00 +0000
您会看到日期对于日、年、月是如何准确的,但请查看确切时间,当前时间(现在)是 12:43:55,但未来的一周是 4:00:00 这是因为我没有要求 NSMinutesCalendarUnit、NSHoursCalendarUnit、NSSecondsCalendarUnit ......所以如果我想要一个完美的日期,除非我要求每一件事,否则你可能并不需要如此准确,事实上你甚至可能想要设置你自己的时间。
现在,如果您想要一个静态日期,即用户输入的日期,您将需要使用NSDateFormatter
下面的示例
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setCalendar:currentCalendar];
[dateFormatter setDateFormat:@"mm/dd/yyyy"];
NSDate* birthdayDate = [dateFormatter dateFromString:@"10/05/2013"];
现在您想知道如何知道今天是否是保存的指定日期。假设您将日期存储在NSUserDefaults
服务器或某个地方,比较日期的最简单方法是使用比较功能NSDate
NSDate* rightNow = [NSDate date];
NSDate* storedDate = [[NSUserDefaults standardUserDefaults] objectForKey@"storedDate"] // some date from server, or UserDefaults
NSComparisonResult = [rightNow compare:storedDate];
这有点不足,因为它测试完美,但它会返回值NSOrderedSame
是否相等,NSOrderedDescending
如果storedDate 在rightNow 之后,NSOrderedAscending
如果storedDate 在rightNow 之前。这完全取决于时间间隔。如果您只想要一个通用的一天,则必须通过组件对其进行测试
NSDate* rightNow = [NSDate date];
NSDate* birthdayDate = [[NSUserDefaults standardUserDefaults] objectForKey@"birthday"]
NSDateComponents* todayComponents = [currentCalendar components:(NSDayCalendarUnit | NSMonthCalendarUnit) fromDate:rightNow];
NSDateComponents* birthdayComponents = [currentCalendar components:(NSDayCalendarUnit | NSMonthCalendarUnit) fromDate:birthdayDate];
BOOL dayIsTheSame = ( todayComponents.day == birthdayComponents.day );
BOOL monthIsTheSame = ( todayComponents.month == birthdayComponents.month );
BOOL todayIsBirthday = ( dayIsTheSame && monthIsTheSame );
if (todayIsBirthday) {
[self.imgViewBirthday setImage[UIImage imageNamed:@"cake.png"]];
}
在您的问题中,您指定了一个图像数组,假设您有一个不同的图像,具体取决于它是哪一小时或哪一分钟,您将在请求NSMinutesCalendarUnit
作为该数组的索引后使用组件 todayComponent.minute;
UIImage* currentImageToDisplay = [self.arrayOfImage objectAtIndex:todayComponent.minute];
self.imageView.image = currentImageToDisplay;
参考: NSDate, NSDateFormatter, NSDateComponents, NSCalendar, NSTimer
如果我现在了解您的问题,那么您可能会检查出使用递归块的一种奇特方法是:
#import <Foundation/Foundation.h>
#import <dispatch/dispatch.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSArray* dates = @[@1, @1, @1, @1, @1, @1, @1, @1, @1];
NSArray* urls = @[@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I"];
NSEnumerator* dateIter = [dates objectEnumerator];
NSEnumerator* urlIter = [urls objectEnumerator];
typedef void(^block_t)(NSEnumerator* dateIter, NSEnumerator* urlIter);
block_t asyncFunc;
__block __weak block_t _asyncFunc = asyncFunc = ^(NSEnumerator* dateIter, NSEnumerator* urlIter) {
NSNumber* date = [dateIter nextObject];
NSString* url = [urlIter nextObject];
if (date != nil && url != nil) {
double delayInSeconds = [date doubleValue];
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_global_queue(0, 0), ^(void){
NSLog(@"%@", url);
_asyncFunc(dateIter, urlIter);
});
}
else {
printf("\n");
return;
}
};
// start:
asyncFunc(dateIter, urlIter);
sleep (10);
}
return 0;
}
笔记:
“日期”实际上是“延迟”,在本示例中 URL 实际上只是字符串。您应该可以根据需要进行调整。当然,NSLog(@"%@", url);
实际上会显示您的图像。
此外,块asyncFunc是异步的!