iphone - Obj-C, How to store / retrieve several date ranges and evaluate it for use based on past or future, least code possible? -


i need produce functions allow me store , retrieve date ranges. evaluate dates based on todays date, add them array.

i'm not sure how many ranges i'll need keep.

perhaps you've seen similar example of can use reference?

edit. need save them use when app next run too.

you can represent date range in 2 ways:

  • start date + end date
  • start date + duration

you can represent date nsdate instance, double (or, if desperately need save memory, int, unix timestamp). i'd make class that.

@interface daterange : nsobject <nscoding> {     nstimeinterval start, end; } @property (nonatomic, assign) nsdate* startdate; @property (nonatomic, assign) nsdate* enddate; @property (nonatomic, assign) nstimeinterval duration; - (bool) containsdate: (nsdate *) date; @end  @implementation daterange  - (nsdate *) startdate {     return [nsdate datewithtimeintervalsincereferencedate: start]; }  - (void) setstartdate: (nsdate *) date {     start = [date timeintervalsincereferencedate]; }  - (nsdate *) enddate {     return [nsdate datewithtimeintervalsincereferencedate: end]; }  - (void) setenddate: (nsdate *) date {     end = [date timeintervalsincereferencedate]; }  - (nstimeinterval) duration {     return end - start; }  - (void) setduration: (nstimeinterval) newduration {     end = start + newduration; }  - (bool) containsdate: (nsdate *) date {     nstimeinterval d = [date timeintervalsincereferencedate];     return d > start && d < end; }  - (id) initwithcoder: (nscoder *) coder {     if ( ( self = [super init] ) ) {         start = [coder decodedoubleforkey: @"start"];         end = [coder decodedoubleforkey: @"end"];     }     return self; }  - (void) encodewithcoder: (nscoder *) coder {     [coder encodedouble: start forkey: @"start"];     [coder encodedouble: end forkey: @"end"]; }  - (bool) isequal: (id) daterange {     if ( [self class] != [daterange class] )         return no;     return [self.startdate isequaltodate: ((daterange *)daterange).startdate] && [self.enddate isequaltodate: ((daterange *)daterange).enddate]; }  - (nsinteger) hash {     return (nsinteger) (end - start); }  @end 

the bonus point can store many ranges in cocoa collections (such nsarray) needed. leave better implementation of -isequal: , -hash exercise you, dear reader.

to save daterange object in nsuserdefaults:

nsdata *daterangearchive = [nskeyedarchiver archiveddatawithrootobject: daterange]; [[nsuserdefaults standarduserdefaults] setobject: daterangearchive forkey: mykey]; 

to read daterange object nsuserdefaults:

daterange *dr = [nskeyedunarchiver unarchiveobjectwithdata: [[nsuserdefaults standarduserdefaults] dataforkey: mykey]]; // returns autoreleased daterange object 

similarly, if need store nsarray of dateranges, can either archive whole array or create array of archived dateranges (the former should faster):

nsdata *daterangearchive = [nskeyedarchiver archiveddatawithrootobject: arrayofdateranges]; [[nsuserdefaults standarduserdefaults] setobject: daterangearchive forkey: mykey]; 

if think that's repetitive code project, can extend nsuserdefaults this:

@interface nsuserdefaults (myextensions) - (daterange *) daterangeforkey: (nsstring *) defaultname; - (void) setdaterange: (daterange *) daterange forkey: (nsstring *) defaultname; @end  @implementation nsuserdefaults (myextensions)  - (daterange *) daterangeforkey: (nsstring *) defaultname {     return [nskeyedunarchiver unarchiveobjectwithdata: [self dataforkey: defaultname]]; }  - (void) setdaterange: (daterange *) daterange forkey: (nsstring *) defaultname {     [self setobject: [nskeyedarchiver archiveddatawithrootobject: daterange] forkey: defaultname]; }  @end 

Comments

Popular posts from this blog

java - SNMP4J General Variable Binding Error -

windows - Python Service Installation - "Could not find PythonClass entry" -

Determine if a XmlNode is empty or null in C#? -