рд╣рдо NSCoding рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ

рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ рдЕрдкрдиреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рдпрд╛ рдЗрди-рдРрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? NSUserDefaults рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдмрдЪрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



рдЬрдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдИ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
Peers.TV рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рд╣рдордиреЗ рдирд┐рдореНрди рдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ - рдЖрд░реНрдХрд╛рдЗрд╡рд░реНрд╕ рдФрд░ NSCoding рдкреНрд░реЛрдЯреЛрдХреЙрд▓ред рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдПрдХ рд╣реА рдбреЛрдореЗрди рдХреЗ рдЕрдВрджрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдПрдХрдЬреБрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реА рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ред


рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдПред Peers.TV рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдСрдирд▓рд╛рдЗрди рдЯреАрд╡реА рджреЗрдЦрдиреЗ рдФрд░ рдЯреАрд╡реА рд╢реЛ рд╕рдВрдЧреНрд░рд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЬ рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╖рдпреЛрдВ рдХреЗ 30 рдЪреИрдирд▓ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдкрд╣рд▓реЗ рдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реЛрддрд╛ рд╣реИ, рдЕрдВрддрд░рдг рд╕рдордп рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЦрд░реАрдж, рдПрдХ рд╕рдВрдЧреНрд░рд╣ - рдпрд╣ рд╕рдм рдЕрдкрдиреА рдЕрд▓рдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ NSCoding рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред

рдПрдирдПрд╕рд╕реА рдХреЛрдбрд┐рдВрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдЕрд╡рд╛рдВрдЫрд┐рдд рдкрд╣реБрдВрдЪ рд╕реЗ рдПрдХ рдЖрд╡реЗрджрди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ-рд╕рд┐рдВрдЧрд▓рдЯрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реНрд╡рдпрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 5 рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

@property (nonatomic, assign) BOOL isPasscodeEnabled; @property (nonatomic, assign) NSUInteger attemptCount; @property (nonatomic, assign) NSTimeInterval checkInterval; @property (nonatomic, strong) NSDate *nextCheckDate; @property (nonatomic, strong) NSString *applicationVersion; 


рддрджрдиреБрд╕рд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдХ рдХреБрдВрдЬреА рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдб рднреА рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдм рд╡рд╛рдкрд╕ NSCoding рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЖрдкрдХреЛ рдХреНрд░рдордмрджреНрдзрддрд╛ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдбреЗрдЯрд╛ рдХреЗ рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдХреНрд░рдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 2 рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 - (void)encodeWithCoder:(NSCoder *)aCoder; - (id)initWithCoder:(NSCoder *)aDecoder; 


рд╣рдореЗрдВ NSKeyedArchiver рдФрд░ NSKeyedUnarchiver рд╡рд░реНрдЧ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рднреА рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпреЗ рд╡рд░реНрдЧ рдХреНрд░рдордмрджреНрдзрддрд╛ рдФрд░ рдХреБрдВрдЬреА рдбреЗрдЯрд╛ рдХреЗ рдбреАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдЕрдЧрд▓рд╛, рд╣рдо рдЙрд╕ рд╡рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдЧрд╛ред

рдЗрдВрдЯрд░рдлреЗрд╕:

 @interface PassCodeSettings: NSObject<NSCoding> @property (nonatomic, assign) BOOL isPasscodeEnabled; @property (nonatomic, assign) NSUInteger attemptCount; @property (nonatomic, assign) NSTimeInterval checkInterval; @property (nonatomic, strong) NSDate *nextCheckDate; @end 


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 @implementation PassCodeSettings - (id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; if (self) { _attemptCount = [aDecoder decodeIntegerForKey:@"attemptCount"]; _isPasscodeEnabled = [aDecoder decodeBoolForKey:@"isPassCodeEnabled"]; _checkInterval = [aDecoder decodeDoubleForKey:@"checkInterval"]; _nextCheckDate = [NSDate dateWithTimeIntervalSince1970:[aDecoder decodeDoubleForKey:@"nextCheckDate"]]; } return self; } - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeBool:_isPasscodeEnabled forKey:@"isPassCodeEnabled"]; [aCoder encodeInteger:_attemptCount forKey:@"attemptCount"]; [aCoder encodeDouble:_checkInterval forKey:@"checkInterval"]; [aCoder encodeDouble:[_nextCheckDate timeIntervalSince1970] forKey:@"nextCheckDate"]; } @end 


рдЕрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ NSCoding рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддрд╛ рд╣реИред NSKeyedArchiver, NSKeyedUnrachiver рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдПрдХ рдордирдорд╛рдирд╛ рд╡рд░реНрдЧ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рдФрд░ рд╕рд╣реЗрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 - (id)init { self = [super init]; if (self) { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; _applicationVersion = [defaults stringForKey:kApplicationVersion]; NSData *passCodeData = [defaults dataForKey:kPasscodeSettings]; if (passCodeData) { _passCodeSettings = [NSKeyedUnarchiver unarchiveObjectWithData:passCodeData]; } else { _passCodeSettings = [PassCodeSettings new]; } } return self; } - (void)savePasscodeSettings { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:[NSKeyedArchiver archivedDataWithRootObject:_passCodeSettings] forKey:kPasscodeSettings]; [defaults synchronize]; } 


рдпрд╣ рдХреБрдЫ рдЯреЛрдЯрдХреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
1. SavePasscodeSettings рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдирд╣реАрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк KVO (рдореБрдЦреНрдп рдореВрд▓реНрдп рдЕрд╡рд▓реЛрдХрди) рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЧреБрдгреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреАрд╡рдирдЪрдХреНрд░ рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
2. рдЖрдк NSNotificationCenter рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рд╕реВрдЪрдирд╛ рднреА рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред

рдХреБрдЦреНрдпрд╛рдд рдорд╛рдЗрдХ рдРрд╢ рд╕реЗ NSCoding рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХред

рд╣рдордиреЗ рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ:
- рдПрдХ рдбреЛрдореЗрди рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛, рдЕрдм рд╣рдо рдЗрд╕ рдбреЛрдореЗрди рдХреЗ рднреАрддрд░ рдбреЛрдореЗрди рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдореВрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
- рдереЛрдбрд╝рд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреА рд╕реБрд╡рд┐рдзрд╛ред

рд╣реИрд░рд╛рдиреА рдХреА рдмрд╛рдд рд╣реИ, рдХреБрдЫ рд▓реЛрдЧ рдбреЗрдЯрд╛ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ NSCoding рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рдмреЗрд╢рдХ, рдореИрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЬрдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдЪрд╛рдВрджреА рдХреА рдЧреЛрд▓реА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕рдм, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

рд╣рдорд╛рд░реЗ Peers.TV рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдЬрд┐рд╕рдореЗрдВ NSCoding рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЛ AppStore рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


Gleb Pinigin, iOS рдбреЗрд╡рд▓рдкрд░

Source: https://habr.com/ru/post/In185918/


All Articles