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

рдЗрд╕рдореЗрдВ рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗрдВред + рдЖрдЗрдХрди рдкрд░ рдЯреИрдк рдХрд░реЗрдВ, рдХрд╛рд░реНрдп рдХрд╛ рдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ, рдареАрдХ рдЯреИрдк рдХрд░реЗрдВред
рдЬреЛрдбрд╝реЗ рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрднреА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдирдпрд╛ рдХрд╛рд░реНрдп рд╢реВрдиреНрдп рд╕реЗрдХрдВрдб рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдорд╛рди рдирд╣реАрдВ рдмрдврд╝рддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░реНрдг рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд╛рд░реНрдп рдкрд░ рдЯреИрдк рдХрд░реЗрдВред рдХрд╛рд░реНрдп рдирд╛рдо рдХреЛ рдкрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдкреВрд░реНрдг рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╣рдорд╛рд░рд╛ рдкрд╣рд▓рд╛ рдЯрд╛рдЗрдорд░ рдмрдирд╛рдПрдБ
рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдореБрдЦреНрдп рдЯрд╛рдЗрдорд░ рдмрдирд╛рдПрдВред
рдЯрд╛рдЗрдорд░ рд╡рд░реНрдЧ, рдЬрд┐рд╕реЗ
NSTimer рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ
, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд╖рдг, рджреЛрдиреЛрдВ рдПрдХрд▓ рдФрд░ рдЖрд╡рдзрд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╢реЗрдбреНрдпреВрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИред
TaskListViewController.swift рдЦреЛрд▓реЗрдВ рдФрд░ рдЗрд╕ рдЪрд░ рдХреЛ
TaskListViewController рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
var timer: Timer?
рдлрд┐рд░ рд╡рд╣рд╛рдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬреЛрдбрд╝реЗрдВ:
рдФрд░ рдЗрд╕ рдХреЛрдб рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ:
@objc func updateTimer() {
рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо:
- рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХрд╛рд░реНрдп рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджреГрд╢реНрдп рдкрдВрдХреНрддрд┐рдпрд╛рдВ рд╣реИрдВред
- рдкреНрд░рддреНрдпреЗрдХ рджреГрд╢реНрдпрдорд╛рди рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдЯрд╛рдЗрдордЯрд╛рдЗрдо рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВред рдпрд╣ рд╡рд┐рдзрд┐ рд╕реЗрд▓ рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреА рд╣реИ (рджреЗрдЦреЗрдВ TaskTableViewCell.swift )ред
рдлрд┐рд░ рдЗрд╕ рдХреЛрдб рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
func createTimer() {
рдпрд╣рд╛рдБ рд╣рдо рд╣реИрдВ:
- рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЯрд╛рдЗрдорд░ рдореЗрдВ рдЯрд╛рдЗрдорд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред
- рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рд░ рд╕реЗрдХрдВрдб рдореЗрдВ рдЕрдкрдбреЗрдЯ рдЯрд╛рдЗрдорд░ () рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЯрд╛рдЗрдорд░ рдмрдирд╛рдПрдВред
рдлрд┐рд░ рдЬреИрд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдорд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
PresentAlertController (_ :) рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ
createTimer () рдЬреЛрдбрд╝реЗрдВред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ рдХреБрдЫ рдирдП рдХрд╛рд░реНрдп рдмрдирд╛рдПрдВред рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рдордп рдХреА рдореЛрд╣рд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдХрдВрдб рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред

рдЯрд╛рдЗрдорд░ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рдЬреЛрдбрд╝реЗрдВ
рдпреВрдЖрдИ рдХреА рдмрджрддрд░ рд╕реНрдерд┐рддрд┐ рдФрд░ рдЕрдзрд┐рдХ рдмреИрдЯрд░реА рдЦрдкрдд рдХреЗ рдХрд╛рд░рдг рдЯрд╛рдЗрдорд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрдорд░ рдЗрд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╕рдордп рдкрд░ рдмрд┐рд▓реНрдХреБрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рд╕рд╣рдирд╢реАрд▓рддрд╛ рд╢реВрдиреНрдп рд╣реИред
рдКрд░реНрдЬрд╛ рдХреА рдЦрдкрдд рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдорд░ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдирд┐рдпрдд рд╕рдордп рдФрд░ рдирд┐рдпрдд рд╕рдордп рдФрд░
рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рд╕рдордп рдХреЗ рдмреАрдЪ рдЯрд╛рдЗрдорд░ рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рдкрд╣рд▓реЗ рдХрднреА рдирд╣реАрдВред
рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЯрд╛рдЗрдорд░ рдХреЗ рд▓рд┐рдП, рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рдорд╛рди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
CreateTimer () рд╡рд┐рдзрд┐ рдореЗрдВ, рдЯрд╛рдЗрдорд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдЬреЛрдбрд╝реЗрдВ:
timer?.tolerance = 0.1
рдРрдк рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рднрд╛рд╡ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдЯрд╛рдЗрдорд░ рд╣реИ), рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдИ рдЯрд╛рдЗрдорд░ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдзрд┐рдХ рдЙрддреНрддрд░рджрд╛рдпреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд┐рд▓реЗрдЧрд╛ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдзрд┐рдХ рдКрд░реНрдЬрд╛ рдХреБрд╢рд▓ рд╣реЛрдЧрд╛ред

рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЯрд╛рдЗрдорд░
рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЯрд╛рдЗрдорд░ рдХрд╛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдХреЛрдб рдХреЛ
рдЕрдкрдбреЗрдЯрдорд┐рдЯрд░ () рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
if let fireDateDescription = timer?.fireDate.description { print(fireDateDescription) }
рдпрд╣ рд╣рдореЗрдВ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЯрд╛рдЗрдорд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдПрдБ, рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗрдВред рдЕрдм рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╣реЛрдо рдмрдЯрди рджрдмрд╛рдПрдВ, рдФрд░ рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВред
рдХрдВрд╕реЛрд▓ рдореЗрдВ, рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ iOS рд╕рднреА рд░рдирд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯрд╛рдЗрдорд░ рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИред рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ iOS рдЯрд╛рдЗрдорд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
рд░рди рд▓реВрдкреНрд╕ рдХреЛ рд╕рдордЭрдирд╛
рдПрдХ рд░рди рд▓реВрдк рдПрдХ рдЗрд╡реЗрдВрдЯ рд▓реВрдк рд╣реИ рдЬреЛ рд╢реЗрдбреНрдпреВрд▓ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рд╕рд╛рдЗрдХрд┐рд▓ рдЪрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рдзрд╛рдЧреЗ рдХреЛ рд╡реНрдпрд╕реНрдд рд░рдЦрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ "рд╕реЛ" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд╛рд▓рддреА рд╣реИ рдЬрдм рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрд╛рдо рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рд▓реВрдк рд╣реЛрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдЕрдм рдЖрдкрдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИ? рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрдорд░ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд▓реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдЖрдк рд╢рд╛рдпрдж рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдкрд░реНрд╢, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИред рдпрджрд┐ рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдХреБрдЫ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╕реНрдд рд╣реИ, рддреЛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ "рдЕрдкреНрд░рддрд┐рд╕рд╛рджреА" (рд╣реИрдВрдЧ) рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЬрдм рдЖрдк рддрд╛рд▓рд┐рдХрд╛ рджреГрд╢реНрдп рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ рддреЛ рд╕реЗрд▓ рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ?

рдЖрдк рдПрдХ рдЕрд▓рдЧ рдореЛрдб рдореЗрдВ рдЯрд╛рдЗрдорд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рди рдЪрдХреНрд░ рдмрддрд╛рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд░рди рд╕рд╛рдЗрдХрд┐рд▓ рдореЛрдб рдХреЛ рд╕рдордЭрдирд╛
рдирд┐рд╖реНрдкрд╛рджрди рдЪрдХреНрд░ рдореЛрдб рдЗрдирдкреБрдЯ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рдЬреИрд╕реЗ рд╕реНрдХреНрд░реАрди рдХреЛ рдЫреВрдирд╛ рдпрд╛ рдорд╛рдЙрд╕ рдХреЛ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛, рдЬрд┐рд╕реЗ рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ "рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ" рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЬреЛ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
IOS рдореЗрдВ рддреАрди рд░рдирдЯрд╛рдЗрдо рдореЛрдб рд╣реИрдВ:
рдбрд┐рдлрд╝реЙрд▓реНрдЯ : рдЗрдирдкреБрдЯ рд╕реНрд░реЛрдд рдЬреЛ NSConnectionObjects рдирд╣реАрдВ рд╣реИрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред
рдЖрдо : рдЗрдирдкреБрдЯ рдЪрдХреНрд░реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрдирдкреБрдЯ рд╕реНрд░реЛрддреЛрдВ, рдЯрд╛рдЗрдорд░, "рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ" рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЯреНрд░реИрдХрд┐рдВрдЧ : рдЕрдиреБрдкреНрд░рдпреЛрдЧ UI рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдореЛрдб
рдЖрдо рд╣реИ ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
createTimer () рд╡рд┐рдзрд┐ рдХреА рд╕рд╛рдордЧреНрд░реА
рдХреЛ рдирд┐рдореНрди рдХреЗ
рд╕рд╛рде рдмрджрд▓реЗрдВ :
if timer == nil { let timer = Timer(timeInterval: 1.0, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true) RunLoop.current.add(timer, forMode: .common) timer.tolerance = 0.1 self.timer = timer }
рдкрд┐рдЫрд▓реЗ рдХреЛрдб рд╕реЗ рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ TaskListViewController рдХреЛ рдЯрд╛рдЗрдорд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕ рдЯрд╛рдЗрдорд░ рдХреЛ
рд╕рд╛рдорд╛рдиреНрдп рдореЛрдб рдореЗрдВ рд░рди рд▓реВрдк рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВред

рдЕрдм рдЯреЗрдмрд▓ рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдкрд░ рднреА рд╕реЗрд▓ рдХреЗ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреАрдореЗрд╢рди рдЬреЛрдбрд╝реЗрдВ
рдЕрдм рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдзрд╛рдИ рдПрдиреАрдореЗрд╢рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ - рдЧреЗрдВрдж рд╕реНрдХреНрд░реАрди рдХреЗ рдиреАрдЪреЗ рд╕реЗ рдмрд╣реБрдд рдКрдкрд░ рддрдХ рдЙрдареЗрдЧреАред
TaskListViewController рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрди рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:
рдЗрди рдЪрд░реЛрдВ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣реИ:
- рдПрдиреАрдореЗрд╢рди рдЯрд╛рдЗрдорд░ рднрдВрдбрд╛рд░рдгред
- рд╢реБрд░реБрдЖрдд рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЗ рдЕрдВрдд рдХреЗ рд╕рдордп рдХрд╛ рднрдВрдбрд╛рд░рдгред
- рдПрдиреАрдореЗрд╢рди рдХреА рдЕрд╡рдзрд┐ред
- рдПрдиреАрдореЗрд╢рди рдКрдВрдЪрд╛рдИред
рдЕрдм
TaskListViewController.swift рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд TaskListViewController
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬреЛрдбрд╝реЗрдВ:
рдпрд╣рд╛рдБ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
- рдбрд┐рд╡рд╛рдЗрд╕ рд╕реНрдХреНрд░реАрди рдХреА рдКрдВрдЪрд╛рдИ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реБрдП, рдПрдиреАрдореЗрд╢рди рдХреА рдКрдВрдЪрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ
- рдЧреЗрдВрдж рдХреЛ рд╕реНрдХреНрд░реАрди рдХреЗ рдмрд╛рд╣рд░ рдХреЗрдиреНрджреНрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреА рджреГрд╢реНрдпрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
- рдПрдиреАрдореЗрд╢рди рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рд╕рдордп рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ
- рд╣рдо рдПрдиреАрдореЗрд╢рди рдЯрд╛рдЗрдорд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 60 рдмрд╛рд░ рдПрдиреАрдореЗрд╢рди рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ
рдЕрдм рд╣рдореЗрдВ рдмрдзрд╛рдИ рдПрдиреАрдореЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реНрдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
ShowCongratulationAnimation () рдХреЗ рдмрд╛рдж рдЗрд╕ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝реЗрдВ:
func updateAnimation() {
рд╣рдо рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ:
- рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдПрдВрдбрдЯрд╛рдЗрдо рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЯрд╛рдЗрдо рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ
- рдирд┐рд░рдВрддрд░ рд╕рдордп рдмрдЪрд╛рдУ
- рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдВрддрд┐рдо рд╕рдордп рдЕрднреА рддрдХ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рдЖ рдЪреБрдХрд╛ рд╣реИ, рддреЛ рдЯрд╛рдЗрдорд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдФрд░ рд╣рдорд╛рд░реА рдЧреЗрдВрдж рдХреЛ рдЫрд┐рдкрд╛рдПрдВ
- рдЧреЗрдВрдж рдХреЗ рдирдП y- рд╕рдордиреНрд╡рдп рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ
- рдЧреЗрдВрдж рдХреА рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдкрд┐рдЫрд▓реА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреА рдЬрд╛рддреА рд╣реИ
рдЕрдм
// TODO рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд
рдХрд░реЗрдВ: рдЗрд╕ рдХреЛрдб рдХреЗ
рд╕рд╛рде рдпрд╣рд╛рдВ showCongratulationAnimation () рдореЗрдВ
рдПрдирд┐рдореЗрд╢рди :
self.updateAnimation()
рдЬрдм рднреА рдЯрд╛рдЗрдорд░ рдХреА рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдЕрдм
рдЕрдкрдбреЗрдЯрдиреЗрдо () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣реБрд░реНрд░реЗ, рд╣рдордиреЗ рдПрдХ рдПрдиреАрдореЗрд╢рди рдмрдирд╛рдпрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ ...
рдПрдиреАрдореЗрд╢рди рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдерд╛, рд╣рдорд╛рд░реЗ рдирдП рдПрдиреАрдореЗрд╢рди рдХреЛ "рд▓реЙрдиреНрдЪ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдФрд░ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЛ TaskListViewController рдПрдиреАрдореЗрд╢рди
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ :
func showCongratulationsIfNeeded() { if taskList.filter({ !$0.completed }).count == 0 { showCongratulationAnimation() } }
рд╣рдо рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ рдЬрдм рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдХрд╛рд░реНрдп рдкреВрд░реЗ рд╣реЛ рдЧрдП рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдпрд╣
showCongratulationAnimation () рдХрд╣реЗрдЧрд╛ ред
рдЕрдВрдд рдореЗрдВ,
tableView рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВ
(_: didSelectRowAt :) :
showCongratulationsIfNeeded()
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ, рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдПрдВ, рдЙрдиреНрд╣реЗрдВ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ - рдФрд░ рдЖрдк рд╣рдорд╛рд░реЗ рдПрдиреАрдореЗрд╢рди рджреЗрдЦреЗрдВрдЧреЗ!

рд╣рдо рдЯрд╛рдЗрдорд░ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ
рдпрджрд┐ рдЖрдк рдХрдВрд╕реЛрд▓ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрджреНрдпрдкрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдЯрд╛рдЗрдорд░ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд░реНрде рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЯрд╛рдЗрдорд░ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЯрд╛рдЗрдорд░ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ:
func cancelTimer() { timer?.invalidate() timer = nil }
рдпрд╣ рдЯрд╛рдЗрдорд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╢реВрдиреНрдп рдкрд░ рд░реАрд╕реЗрдЯ рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛ рд╕рдХреЗрдВред
рдЕрдорд╛рдиреНрдп () рдЯрд╛рдЗрдорд░ рдХреЛ рд░рди рд▓реВрдк рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИред рд░рди рд▓реВрдк
рдЕрдорд╛рдиреНрдп рдЯрд╛рдЗрдорд░
() рдпрд╛ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдХреЙрд▓
рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдордЬрдмреВрдд рдЯрд╛рдЗрдорд░ рд╕рдВрджрд░реНрдн рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред
рдЕрдм showCongratulationsIfNeeded () рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓реЗрдВ:
func showCongratulationsIfNeeded() { if taskList.filter({ !$0.completed }).count == 0 { cancelTimer() showCongratulationAnimation() } else { createTimer() } }
рдЕрдм, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд╣рд▓реЗ рдЯрд╛рдЗрдорд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рдлрд┐рд░ рдПрдиреАрдореЗрд╢рди рджрд┐рдЦрд╛рдПрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдирдпрд╛ рдЯрд╛рдЗрдорд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╣реАрдВ рд╣реИред
рдРрдк рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред

рдЕрдм рдЯрд╛рдЗрдорд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЪрд┐рдХрдиреА рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреИрдбрд┐рд╕рдкреНрд▓реЗрд▓рд┐рдВрдХ
рдПрдиреАрдореЗрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдЯрд╛рдЗрдорд░ рдПрдХ рдЖрджрд░реНрд╢ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдЖрдкрдиреЗ рдПрдирд┐рдореЗрд╢рди рдкрд░ рдХреБрдЫ рдлреНрд░реЗрдо рд╕реНрдХрд┐рдк рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдиреАрдореЗрд╢рди рджреЗрдЦреЗ рд╣реЛрдВрдЧреЗ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рддреЗ рд╣реИрдВред
рд╣рдордиреЗ рдЯрд╛рдЗрдорд░ рдХреЛ 60Hz рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЯрд╛рдЗрдорд░ рд╣рд░ 16 рдПрдордПрд╕ рдореЗрдВ рдПрдиреАрдореЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред рд╕реНрдерд┐рддрд┐ рдкрд░ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХреА рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдЯрд╛рдЗрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп
, рд╣рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХрд╛ рд╕рд╣реА рд╕рдордп рдХреНрдпрд╛ рд╣реИред рдпрд╣ рдпрд╛ рддреЛ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдпрд╛ рдлреНрд░реЗрдо рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЯрд╛рдЗрдорд░ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЗ рдмреАрдЪ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ (рдЪрд┐рддреНрд░ рдореЗрдВ рдиреАрд▓реЗ рдбреЙрдЯреНрд╕)ред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдХреЙрд▓ рдкреНрд░рддреНрдпреЗрдХ 16 рдПрдордПрд╕ рдореЗрдВ рд╣реЛрдЧреАред
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдиреАрдореЗрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 8 рдПрдордПрд╕ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЖрдХреГрддрд┐ рдореЗрдВ рджреВрд╕рд░реЗ рдлреНрд░реЗрдо рдХреЛ рджреЗрдЦреЗрдВред рджреВрд╕рд░реЗ рдлреНрд░реЗрдо рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рд╕рдордп рдореЗрдВ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдиреАрдореЗрд╢рди рдХреЗ рджреВрд╕рд░реЗ рдлреНрд░реЗрдо рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░ рджреЗрдЧрд╛ред
рдХреИрдбрд┐рд╕рдкреНрд▓реЗрд▓рд┐рдВрдХ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛
CADisplayLink рдХреЛ рдкреНрд░рддрд┐ рдлреНрд░реЗрдо рдПрдХ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрдерд╛рд╕рдВрднрд╡ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдиреАрдореЗрд╢рди рдлреНрд░реЗрдо рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рд╕рднреА 16 рдПрдордПрд╕ рд╣реЛрдВрдЧреЗ рдФрд░ рдЖрдИрдУрдПрд╕ рдПрдХ рдлреНрд░реЗрдо рдХреЛ рдирд╣реАрдВ рдЧрд┐рд░рд╛рдПрдЧрд╛ред
рдХреИрдбрд┐рд╕рдкреНрд▓реЗрд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
рдПрдиреАрдореЗрд╢рди рдЯрд╛рдЗрдкрд░ рдХреЛ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕ рдХреЛрдб рдХреЛ рдмрджрд▓реЗрдВ
var animationTimer: Timer?
рдЗрд╕ рдПрдХ рдкрд░:
var displayLink: CADisplayLink?
рдЖрдкрдиреЗ
CADisplayLink рдХреЗ рд╕рд╛рде
рдЯрд╛рдЗрдорд░ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред
рдХреИрдбрд┐рд╕рдкреНрд▓реЗрд▓рд┐рдВрдХ рдПрдХ рдЯрд╛рдЗрдорд░ рджреГрд╢реНрдп рд╣реИ рдЬреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рд╡рд░реНрдЯрд┐рдХрд▓ рд╕реНрдХреИрди рд╕реЗ рдмрдВрдзрд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ GPU рддрдм рддрдХ рд╡рд┐рд░рд╛рдо рджреЗрдЧрд╛ рдЬрдм рддрдХ рд╕реНрдХреНрд░реАрди GPU рдХрдорд╛рдВрдб рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рд╣рдореЗрдВ рдЪрд┐рдХрдиреА рдПрдиреАрдореЗрд╢рди рдорд┐рд▓рддрд╛ рд╣реИред
рдЗрд╕ рдХреЛрдб рдХреЛ рдмрджрд▓реЗрдВ
var startTime: TimeInterval?, endTime: TimeInterval?
рдЗрд╕ рдПрдХ рдкрд░:
var startTime: CFTimeInterval?, endTime: CFTimeInterval?
рдЖрдкрдиреЗ
CFTimeInterval рдХреЗ рд╕рд╛рде
TimeInterval рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рдЬреЛ CADisplayLink рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред
ShowCongratulationAnimation () рд╡рд┐рдзрд┐ рдХреЗ рдкрд╛рда рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ:
func showCongratulationAnimation() {
рд╣рдо рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
- рдПрдиреАрдореЗрд╢рди рдХреА рдКрдВрдЪрд╛рдИ рд╕реЗрдЯ рдХрд░реЗрдВ, рдЧреЗрдВрдж рдФрд░ рджреГрд╢реНрдпрддрд╛ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ - рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛ред
- рдЖрд░рдВрднрд┐рдХ рд╕рдордп CACurrentMediaTime () (рджрд┐рдирд╛рдВрдХ () рдХреЗ рдмрдЬрд╛рдп ) рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ)
- рд╣рдо рдХреИрдбрд┐рд╕рдкреНрд▓реЗрд▓рд┐рдВрдХ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдореЛрдб рдореЗрдВ рд░рди рд▓реВрдк рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реЗ
updateAnimation () рдХреЛ рдмрджрд▓реЗрдВ:
- рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ objc рдЬреЛрдбрд╝реЗрдВ (рдХреИрдбрд┐рд╕рдкреНрд▓реЗрд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП, рдЪрдпрдирдХрд░реНрддрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред
- CoreAnimation рдХреА рддрд╛рд░реАрдЦ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдирд╛рдВрдХ () рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХрд░рдг рдмрджрд▓реЗрдВред
- CADTplayLink рдХреЗ рдПрдХ рдард╣рд░рд╛рд╡ рдФрд░ рдЕрдорд╛рдиреНрдп рдХреЗ рд╕рд╛рде animTimer.invalidate () рдХреЙрд▓ рдХреЛ рдмрджрд▓реЗрдВред рдпрд╣ рдХреИрдбрд┐рд╕рдкреНрд▓реЗрд▓рд┐рдВрдХ рдХреЛ рд░рди рд▓реВрдк рд╕реЗ рднреА рд╣рдЯрд╛ рджреЗрдЧрд╛ред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ!

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