Easy to understand in iOS, countdown/countdown
The sample code is easy to understand:
#import
@interface ViewController : UIViewController@property (weak, nonatomic) IBOutlet UILabel *dayLabel;@property (weak, nonatomic) IBOutlet UILabel *hourLabel;@property (weak, nonatomic) IBOutlet UILabel *minuteLabel;@property (weak, nonatomic) IBOutlet UILabel *secondLabel;@end
# Import "ViewController. h "@ interface ViewController () {dispatch_source_t _ timer ;} @ end @ implementation ViewController/*** obtains the string of the date, year, month, and day. * here, the test uses the * @ return format as year-month-day */-(NSString *) getyyyymmdd {NSDate * now = [NSDate date]; NSDateFormatter * formatDay = [[NSDateFormatter alloc] init]; formatDay. dateFormat = @ "yyyy-MM-dd"; NSString * dayStr = [formatDay stringFromDate: now]; return dayStr;}-(void) viewDidL Oad {[super viewDidLoad]; NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat: @ "yyyy-MM-dd"]; NSDate * endDate = [dateFormatter dateFromString: [self getyyyymmdd]; NSDate * endDate_tomorrow = [[NSDate alloc] expiration :( [endDate timeIntervalSinceReferenceDate] + 24*3600)]; NSDate * startDate = [NSDate date]; NSTimeInterval timeInter Val = [endDate_tomorrow timeIntervalSinceDate: startDate]; if (_ timer = nil) {_ block int timeout = timeInterval; // countdown time if (timeout! = 0) {dispatch_queue_t queue = queue (queue, 0); _ timer = dispatch_source_create (queue, 0, 0, queue); queue (_ timer, dispatch_walltime (NULL, 0 ), 1.0 * NSEC_PER_SEC, 0); // execute dispatch_source_set_event_handler (_ timer, ^ {if (timeout <= 0) {// The countdown ends. Disable dispatch_source_cancel (_ timer ); _ timer = nil; dispatch_async (dispatch_get_main_queue (), ^ {self. dayLabel. text = @ ""; self. hourLabel. text = @ "00"; self. minuteLabel. text = @ "00"; self. secondLabel. text = @ "00" ;}) ;}else {int days = (int) (timeout/(3600*24); if (days = 0) {self. dayLabel. text = @ "";} int hours = (int) (timeout-days * 24*3600)/3600); int minute = (int) (timeout-days * 24*3600-hours * 3600)/60; int second = timeout-days * 24*3600-hours * 3600-minute * 60; dispatch_async (dispatch_get_main_queue (), ^ {if (days = 0) {self. dayLabel. text = @ "0 days";} else {self. dayLabel. text = [NSString stringWithFormat: @ "% d days", days];} if (hours <10) {self. hourLabel. text = [NSString stringWithFormat: @ "0% d", hours];} else {self. hourLabel. text = [NSString stringWithFormat: @ "% d", hours];} if (minute <10) {self. minuteLabel. text = [NSString stringWithFormat: @ "0% d", minute];} else {self. minuteLabel. text = [NSString stringWithFormat: @ "% d", minute];} if (second <10) {self. secondLabel. text = [NSString stringWithFormat: @ "0% d", second];} else {self. secondLabel. text = [NSString stringWithFormat: @ "% d", second] ;}}); timeout -- ;}}); dispatch_resume (_ timer) ;}} effect: