VKontakte рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рддрд┐рджрд┐рди 10 рдмрд┐рд▓рд┐рдпрди рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдлреЛрдЯреЛ, рдХреЙрдорд┐рдХреНрд╕, рдореЗрдореНрд╕ рдФрд░ рдЕрдиреНрдп рдЕрдЯреИрдЪрдореЗрдВрдЯ рднреЗрдЬрддреЗ рд╣реИрдВред рд╣рдо рдЖрдкрдХреЛ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ 
URLProtocol рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЖрдП, рдФрд░ рдЪрд░рдг рджрд░ рдЪрд░рдг рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреИрд╕реЗ рдХрд░реЗрдВред
рд▓рдЧрднрдЧ рдбреЗрдврд╝ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдЖрдИрдУрдПрд╕ рдХреЗ рд▓рд┐рдП рд╡реАрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдкреВрд░реЗ рдЬреЛрд░реЛрдВ рдкрд░ рдерд╛ред рдпрд╣ рдкрд╣рд▓рд╛ рдЦрдВрдб рд╣реИ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ 
vkm (VK рд╕рдВрджреЗрд╢) рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдЬреЛ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рднреА рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд╕рдВрджреЗрд╢ рдкрдврд╝рдиреЗ рдФрд░ рднреЗрдЬрдиреЗ рдХреА рдореВрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧреАред рдореБрдЦреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ, рд╕рдВрджреЗрд╢ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХрдВрдЯреЗрдирд░ рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рдореЗрдВ рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рдпрд╛ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреАред
рд╕рдВрджреЗрд╢ VKontakte рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣ рдШрдбрд╝реА рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗред 
messages рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдо рдХреЛрдб рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд▓рдбрд╝рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рдпрд╣ рдкрд╕рдВрдж рдЖрдпрд╛ рдХрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдмрдбрд╝реЗ рдХрд░реАрдиреЗ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд░рд╣реЗред
рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╛рдЧ рдХреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рднрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛: рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдерд╛ рдХрд┐ рд╕рдВрджреЗрд╢ рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рддрд╕реНрд╡реАрд░ рдХреЛ рдкрд╣рд▓реЗ рдорд╕реМрджреЗ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕реЗ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪреА рдореЗрдВред рд╣рдо 
PHImageManager рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдХрдард┐рди рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИред
рд╕реНрдиреИрдкрд╢реЙрдЯ рдЪреБрдирддреЗ рд╕рдордп, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдлрд╝рд┐рд▓реНрдЯрд░, рд░реЛрдЯреЗрдЯ, рдХреНрд░реЙрдк рдЖрджрд┐ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рд╡реАрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ 
AssetService рдШрдЯрдХ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рд╕рдВрджреЗрд╢ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реАрдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
рдареАрдХ рд╣реИ, рдХрд╛рд░реНрдп рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд▓рдЧрднрдЧ рдФрд╕рдд рд╕рдорд╛рдзрд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рднрд┐рдиреНрдирддрд╛рдПрдВ рд╣реИрдВред рд╣рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рдбрдВрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рддрд░реАрдХреЛрдВ рд╕реЗ рднрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдПрд╕реЗрдЯ рд╕реЗрд╡рд╛ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдХреИрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ! рдЪрд┐рдкрдЪрд┐рдкрд╛рд╣рдЯ рдХреЗ рд▓рд┐рдПред рдлрд┐рд░ рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдХреБрдЫ рд╕реЗрд╡рд╛ рдпрд╛ рдкреНрд░рдмрдВрдзрдХ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╕рдм рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред рдЙрд╕реА рд╕рдордп, рдПрдХ рдирдпрд╛ рдбреЗрд╡рд▓рдкрд░ рдЕрднреА рднреА рдЖрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реБрдП, рд╡рд╣ рдХрд╛рдирд╛рдлреВрд╕реА рдореЗрдВ рдирд┐рдВрджрд╛ рдХрд░рддрд╛ рд╣реИ ... (рдареАрдХ рд╣реИ, рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ)ред рдЙрд╕реА рд╕рдордп, рдЙрд╕рдХреЗ рдорд╛рдереЗ рдкрд░ рдкрд╕реАрдирд╛ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред
рдпрд╣ рдлреИрд╕рд▓рд╛ 
рд╣рдорд╛рд░реА рдкрд╕рдВрдж рдХрд╛ 
рдирд╣реАрдВ рдерд╛ред рдирдИ рд╕рдВрд╕реНрдерд╛рдПрдБ рдкреНрд░рдХрдЯ рдХрд░рддреА рд╣реИрдВ рдХрд┐ рд╕рдВрджреЗрд╢ рдШрдЯрдХреЛрдВ рдХреЛ 
AssetService рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ 
AssetService ред рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдореБрдЦреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд▓рд┐рдВрдХ рдерд╛, рдЬрд┐рд╕рд╕реЗ рд╣рдо рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рдВрджреЗрд╢ рдЦрдВрдб рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗред
рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рддрд╛рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХреБрдЫ рднреА рдкрддрд╛ рди рдЪрд▓реЗ рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рдХреА рддрд╕реНрд╡реАрд░ рдХреЛ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдХреНрдпрд╛ рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд╡реЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдмрд╕ 
URL рджреНрд╡рд╛рд░рд╛ред рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВред
рддреЛ рд╣рдо рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдЖрдП: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕реНрдерд╛рдиреАрдп рд╕рдВрдкрддреНрддрд┐ рдХреЛ 
URL рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 
рдерд╛рдиреЛрд╕ рдХреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ рдПрдХ рдХреНрд▓рд┐рдХ рд╕реЗ, рдпрд╣ рд╣рдорд╛рд░реА рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░ рджреЗрдЧрд╛: рдЖрдкрдХреЛ 
AssetService рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрд╛рдирдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдирдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рд╡реНрдпрд░реНрде рдореЗрдВ рдПрдВрдЯреНрд░реЙрдкреА рдмрдврд╝рд╛рдирд╛, рдПрдХ рдирдИ рдкреНрд░рдХрд╛рд░ рдХреА рдЫрд╡рд┐ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рд╕реАрдЦрдирд╛, рдбреЗрдЯрд╛ рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ред рдПрдХ рдпреЛрдЬрдирд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред
рд╣рдореЗрдВ рдмрд╕ рдПрдХ URL рдЪрд╛рд╣рд┐рдП
рд╣рдордиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ 
URL рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рд╕реНрдерд╛рдиреАрдп рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ:
 asset://?id=123&width=1920&height=1280 
рд╣рдо 
PHObject рд░реВрдк рдореЗрдВ 
localIdentifier рдХреЗ 
localIdentifier рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рдЖрдХрд╛рд░ рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 
width рдФрд░ 
height рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗред рд╣рдо 
crop , 
filter , 
rotate рдЬреИрд╕реЗ рдХреБрдЫ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рднреА рдЬреЛрдбрд╝рддреЗ 
rotate , рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдЫрд╡рд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдЗрди 
URL рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП 
URL рд╣рдо рдПрдХ 
AssetURLProtocol :
 class AssetURLProtocol: URLProtocol { } 
рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп 
AssetService рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрд╡рд┐ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдбреЗрдЯрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИред
рдпрд╣ рд╕рдм рд╣рдореЗрдВ 
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ 
URL Loading System рдХреЗ рдХрд╛рдо рдХреЛ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реМрдВрдкрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЕрдВрджрд░ рд╕рдмрд╕реЗ рдЖрдо 
URL рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдХреЗрд╡рд▓ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рд╛рд░реВрдк рдореЗрдВред рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рддрдВрддреНрд░ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдФрд░ рдорд╛рдирдХ 
URLCache рдХреИрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдХреИрд╢рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред
рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛? рдпрджрд┐, рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рддреЗ рд╣реБрдП, рдЖрдк рдЧреИрд▓рд░реА рд╕реЗ рд╕рдВрджреЗрд╢ рдХреЛ VKontakte рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рд╕рдВрджреЗрд╢ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рд╛рдБ :)
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХреЗ 
URLProtocol рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ 
URLProtocol , рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред
рд╣рдо рдЦреБрдж рдХреЛ рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкрд░ рдореИрдк рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕реНрдиреИрдкрд╢реЙрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо 
MapKit рд╕реЗ рдорд╛рдирдХ 
MKMapSnapshotter рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╣рдо рдХрд╕реНрдЯрдо 
URLProtocol рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗред рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо 
URL рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдирдХреНрд╢рд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдмрд┐рдВрджреБ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ - рдЗрд╕рдХрд╛ рдЕрдХреНрд╖рд╛рдВрд╢ рдФрд░ рджреЗрд╢рд╛рдВрддрд░ ( 
latitude , 
longitude )ред рдХрд╕реНрдЯрдо 
URL рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдЬрд╛рдирдХрд╛рд░реА рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
 map://?latitude=59.935634&longitude=30.325935 
рдЕрдм рд╣рдо 
URLProtocol рд▓рд╛рдЧреВ 
URLProtocol , рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдЪрд▓рд┐рдП 
MapURLProtocol рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдмреЗрд╕ рдХреНрд▓рд╛рд╕ 
URLProtocol рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдирд╛рдо рдХреЗ рдмрд╛рд╡рдЬреВрдж, 
URLProtocol рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред рд╣рдореЗрдВ рд╢рд░реНрдорд┐рдВрджрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣рд╛рдВ рд╣рдо рдЕрдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - 
URLProtocol рдмрд┐рд▓реНрдХреБрд▓ 
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ 
URLProtocol рд╢рд░реНрддреЛрдВ рд╕реЗ рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИред рддреЛ 
MapURLProtocol :
 class MapURLProtocol: URLProtocol { } 
рдЕрдм рд╣рдо рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд┐рдирд╛ 
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:
1. canInit(with:)
 override class func canInit(with request: URLRequest) -> Bool { return request.url?.scheme == "map" } 
рд╣рдорд╛рд░реЗ 
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 
canInit(with:) рд╡рд┐рдзрд┐ рдХреЗ 
canInit(with:) рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗрд╡рд▓ 
URL рдореЗрдВ рдПрдХ 
map рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ред рдХрд┐рд╕реА рднреА рдЕрдиреБрд░реЛрдз рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, 
URL Loading System рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХреГрдд рд╕рднреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдкрдВрдЬреАрдХреГрдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рдЬреЛ рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ 
true рд▓реМрдЯреЗрдЧрд╛, рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
canonicalRequest(for:)
 override class func canonicalRequest(for request: URLRequest) -> URLRequest { return request } 
canonicalRequest(for:) рд╡рд┐рдзрд┐ рдХреИрдиреЛрдирд┐рдХрд▓ рдлреЙрд░реНрдо рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦреБрдж рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣рд╛рдВ рдЖрдк рдпреЛрдЬрдирд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╣реЗрдбрд░ рдХреЛ рдЕрдиреБрд░реЛрдз рдкрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╢реНрдб рдЙрддреНрддрд░реЛрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред 
URLCache рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред
3. startLoading()
startLoading() рд╡рд┐рдзрд┐ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рддрд░реНрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдкрдХреЛ рдЕрдиреБрд░реЛрдз 
URL рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░, рдЗрд╕рдХреЗ 
latitude рдФрд░ 
longitude рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, 
MKMapSnapshotter рдУрд░ 
MKMapSnapshotter рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рдирдЪрд┐рддреНрд░ рд╕реНрдиреИрдкрд╢реЙрдЯ рд▓реЛрдб рдХрд░реЗрдВред
 override func startLoading() { guard let url = request.url, let components = URLComponents(url: url, resolvingAgainstBaseURL: false), let queryItems = components.queryItems else { fail(with: .badURL) return } load(with: queryItems) } func load(with queryItems: [URLQueryItem]) { let snapshotter = MKMapSnapshotter(queryItems: queryItems) snapshotter.start( with: DispatchQueue.global(qos: .background), completionHandler: handle ) } func handle(snapshot: MKMapSnapshotter.Snapshot?, error: Error?) { if let snapshot = snapshot, let data = snapshot.image.jpegData(compressionQuality: 1) { complete(with: data) } else if let error = error { fail(with: error) } } 
рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдВрдж рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
 func complete(with data: Data) { guard let url = request.url, let client = client else { return } let response = URLResponse( url: url, mimeType: "image/jpeg", expectedContentLength: data.count, textEncodingName: nil ) client.urlProtocol(self, didReceive: response, cacheStoragePolicy: .allowed) client.urlProtocol(self, didLoad: data) client.urlProtocolDidFinishLoading(self) } 
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, 
URLResponse рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдПрдБред рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╣реИред рддрдм рд╣рдо 
URLProtocolClient рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рддреАрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд 
URLProtocolClient ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА 
client рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ 
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдЗрдХрд╛рдИ рд╣реЛрддреА рд╣реИред рдпрд╣ 
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ 
URL Loading System рдХреЗ рдкреВрд░реЗ 
URL Loading System рдмреАрдЪ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ: рдХреИрд╢, рдкреВрд░реНрдгрд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ, рдХрд┐рд╕реА рддрд░рд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВ, рдЖрджрд┐ред рдФрд░ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдмреИрдЪреЛрдВ рдХреЗ рд╕рд╛рде рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ 
URLProtocolClient рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХреА рдкреНрд░рдЧрддрд┐ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 
URLProtocolClient рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
 func fail(with error: Error) { client?.urlProtocol(self, didFailWithError: error) } 
рдпрд╣ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣реИ рдЬреЛ рддрдм рдЕрдиреБрд░реЛрдз рдХреЗ 
completionHandler рдХреЛ рднреЗрдЬреА рдЬрд╛рдПрдЧреА, рдЬрд╣рд╛рдВ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕реБрдВрджрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
4. stopLoading()
рдЬрдм рдХрд┐рд╕реА рдХрд╛рд░рдгрд╡рд╢ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ 
stopLoading() рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдпрд╛ рддреЛ рдПрдХ рд╕рдлрд▓ рд╕рдорд╛рдкрди, рдпрд╛ рддреНрд░реБрдЯрд┐ рдкреВрд░реНрдгрддрд╛ рдпрд╛ рдЕрдиреБрд░реЛрдз рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрдмреНрдЬреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдпрд╛ рдЕрд╕реНрдерд╛рдпреА рдбреЗрдЯрд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реИред
 override func stopLoading() { } 
рдпрд╣ 
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ; рдЗрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд╣реАрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдЪреАрдЬреЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред
URLImageView
 class URLImageView: UIImageView { var task: URLSessionDataTask? var taskId: Int? func render(url: URL) { assert(task == nil || task?.taskIdentifier != taskId) let request = URLRequest(url: url) task = session.dataTask(with: request, completionHandler: complete) taskId = task?.taskIdentifier task?.resume() } private func complete(data: Data?, response: URLResponse?, error: Error?) { if self.taskId == task?.taskIdentifier, let data = data, let image = UIImage(data: data) { didLoadRemote(image: image) } } func didLoadRemote(image: UIImage) { DispatchQueue.main.async { self.image = image } } func prepareForReuse() { task?.cancel() taskId = nil image = nil } } 
рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рд╣реИ, 
UIImageView рдХрд╛ рд╡рдВрд╢рдЬ рд╣реИ, рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд┐рд╕реЗ рдЖрдк рд╢рд╛рдпрдж рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ 
render(url:) рд╡рд┐рдзрд┐ рдореЗрдВ 
URL рджреНрд╡рд╛рд░рд╛ рдЫрд╡рд┐ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ 
image рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╕реБрд╡рд┐рдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдЫрд╡рд┐ рдХреЛ 
http / 
https URL рдпрд╛ рд╣рдорд╛рд░реЗ рдХрд╕реНрдЯрдо 
URL рджреНрд╡рд╛рд░рд╛ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ 
URLSession рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
 let config: URLSessionConfiguration = { let c = URLSessionConfiguration.ephemeral c.protocolClasses = [ MapURLProtocol.self ] return c }() let session = URLSession( configuration: config, delegate: nil, delegateQueue: nil ) 
рд╕рддреНрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдБ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред 
URLSessionConfiguration рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░реЙрдкрд░реНрдЯреА рд╣реИ - 
protocolClasses ред рдпрд╣ 
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд╛рд▓рд╛ рдПрдХ рд╕рддреНрд░ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рддреНрд░ 
http / 
https рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдХрд╕реНрдЯрдо рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 
MapURLProtocol рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
рдЬреЛ рдХреБрдЫ рднреА рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИ рд╡рд╣ рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдореИрдк рд╕реНрдиреИрдкрд╢реЙрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб 
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ 
рд╣реИ ред
рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:
рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ - рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдХреЛ рдЫреЛрдбрд╝рдХрд░: рдЬрдм рд╣рдо рд╕реВрдЪреА рдХреЛ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рдлреЗрдж рдзрдмреНрдмреЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХреИрд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ 
render(url:) рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП, рд╣рдо 
MKMapSnapshotter рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ 
MKMapSnapshotter ред рдпрд╣ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд▓реЛрдбрд┐рдВрдЧ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдВрддрд░рд╛рд▓ред рдпрд╣ рдПрдХ рдбреЗрдЯрд╛ рдХреИрд╢рд┐рдВрдЧ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рддрд╛рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдП рдЧрдП рд╕реНрдиреИрдкрд╢реЙрдЯ рдлрд┐рд░ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рди рд╣реЛрдВред рдпрд╣рд╛рдВ рд╣рдо 
URL Loading System рдХреА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз 
URLCache рд▓рд┐рдП рдПрдХ рдХреИрд╢рд┐рдВрдЧ рддрдВрддреНрд░ рд╣реИред
рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдХреИрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ: рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ред
рдкрдврд╝рдирд╛
рдХреИрд╢реНрдб рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрдврд╝рдиреЗ 
URL Loading System рдХреЗ 
URL Loading System рдХреЛ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдкрд╛рдиреЗ рдореЗрдВ рдорджрдж рдЪрд╛рд╣рд┐рдП:
1. рдХреНрдпрд╛ URLCache рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП?рдмреЗрд╢рдХ, 
URLCache.shared рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╛рдкреНрдд рд╣реЛ 
URLCache.shared , рд▓реЗрдХрд┐рди 
URL Loading System рд╣рдореЗрд╢рд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдЖрдЦрд┐рд░рдХрд╛рд░, рдбреЗрд╡рд▓рдкрд░ рдЕрдкрдиреА рдЦреБрдж рдХреА 
URLCache рдЗрдХрд╛рдИ рдмрдирд╛рдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, 
URLSessionConfiguration session 
URLSessionConfiguration рдореЗрдВ 
urlCache рдЧреБрдг рд╣реИред рдпрд╣ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ 
URLCache рдХрд░реЗрдВрдЧреЗред
 let config: URLSessionConfiguration = { let c = URLSessionConfiguration.ephemeral c.urlCache = ImageURLCache.current c.protocolClasses = [ MapURLProtocol.self ] return c }() 
2. рдХреНрдпрд╛ рдореБрдЭреЗ рдХреИрд╢реНрдб рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпрд╛ рдлрд┐рд░ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ 
URLRequest рдЕрдиреБрд░реЛрдз рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред рдЕрдиреБрд░реЛрдз рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 
URL рдЕрддрд┐рд░рд┐рдХреНрдд 
cachePolicy рддрд░реНрдХ рдореЗрдВ рдХреИрд╢ рдкреЙрд▓рд┐рд╕реА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛрддрд╛ рд╣реИред
 let request = URLRequest( url: url, cachePolicy: .returnCacheDataElseLoad, timeoutInterval: 30 ) 
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди 
.useProtocolCachePolicy , рдЬрд┐рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рднреА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЕрдиреБрд░реЛрдз рдХреА рдХреИрд╢реНрдб рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЦреЛрдЬрдиреЗ рдФрд░ рдЗрд╕рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ 
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдореВрд▓реНрдп 
.returnCacheDataElseLoad рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдЧрд▓реА рдЗрдХрд╛рдИ 
URLProtocol URL Loading System рдХреЛ рдХреБрдЫ рдХрд╛рдо рдкрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛: рдпрд╣ рдХреИрд╢реНрдб рд░реЗрд╕реНрдкреЙрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд░реЛрдз 
urlCache рдХреИрд╢реНрдб рд░рд┐рд╕реНрдкрд╛рдВрд╕ рдХреЗ рд▓рд┐рдП 
cachedResponse(for:) рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдПред рдпрджрд┐ рдХреИрд╢реНрдб рдбреЗрдЯрд╛ рд╣реИ, рддреЛ 
CachedURLResponse URLProtocol рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ 
cachedResponse рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ 
CachedURLResponse рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рддреБрд░рдВрдд рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
 override init( request: URLRequest, cachedResponse: CachedURLResponse?, client: URLProtocolClient?) { super.init( request: request, cachedResponse: cachedResponse, client: client ) } 
CachedURLResponse рдПрдХ рд╕рд░рд▓ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ ( 
Data ) рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛-рдЬрд╛рдирдХрд╛рд░реА ( 
URLResponse ) рд╣реИред
рд╣рдо рдХреЗрд╡рд▓ 
startLoading рд╡рд┐рдзрд┐ рдХреЛ 
startLoading рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдФрд░ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рддреБрд░рдВрдд рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 override func startLoading() { if let cachedResponse = cachedResponse { complete(with: cachedResponse.data) } else { guard let url = request.url, let components = URLComponents(url: url, resolvingAgainstBaseURL: false), let queryItems = components.queryItems else { fail(with: .badURL) return } load(with: queryItems) } } 
рдЕрднрд┐рд▓реЗрдЦ
рдХреИрд╢ рдореЗрдВ рдбреЗрдЯрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред 
URL Loading System рдЗрд╕ рдХрд╛рдо рдХрд╛ рднреА рдзреНрдпрд╛рди рд░рдЦрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрд╕реЗ рдпрд╣ рдмрддрд╛рдирд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрдм рдкреНрд░реЛрдЯреЛрдХреЙрд▓ 
cacheStoragePolicy рдХреИрд╢ рдкреЙрд▓рд┐рд╕реА 
cacheStoragePolicy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 
cacheStoragePolicy ред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рдЧрдгрдирд╛ рд╣реИ:
 enum StoragePolicy { case allowed case allowedInMemoryOnly case notAllowed } 
рдЙрдирдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдФрд░ рдбрд┐рд╕реНрдХ рдкрд░ рдХреИрд╢рд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдпрд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╢рд┐рдВрдЧ рдХреЛ рдореЗрдореЛрд░реА рдФрд░ рдбрд┐рд╕реНрдХ рдкрд░ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреНрдпреЛрдВ рдирд╣реАрдВред
 client.urlProtocol(self, didReceive: response, cacheStoragePolicy: .allowed) 
рдЗрд╕рд▓рд┐рдП, рдХреБрдЫ рд╕рд░рд▓ рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ, рд╣рдордиреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рдореИрдк рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ред рдФрд░ рдЕрдм рдЖрд╡реЗрджрди рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдИ рдФрд░ рдЕрдзрд┐рдХ рд╕рдлреЗрдж рдзрдмреНрдмреЗ рдирд╣реАрдВ рд╣реИрдВ - рдХрд╛рд░реНрдб рдПрдХ рдмрд╛рд░ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдХреИрд╢ рд╕реЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд╣рдореЗрд╢рд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдХреНрд░реИрд╢ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм 
URLCache рд╕рдордп 
URLCache рд╕рд╛рде 
URL Loading System рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдерд╛ред рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ 
рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ : 
URLCache рдХреЗ 
URLCache рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ 
URLCache , 
cachedResponse(for:) рдФрд░ 
storeCachedResponse(_:for:) рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рд░рд╛рдЬреНрдпреЛрдВ рдХреА рдПрдХ рджреМрдбрд╝ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ 
URLCache рдЙрдкрд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ рдЙрдореНрдореАрдж рдереА рдХрд┐ 
URLCache.shared рдХрд╛ рдЙрдкрдпреЛрдЧ 
URLCache.shared рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдЧрд▓рдд рдирд┐рдХрд▓рд╛ред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрд▓рдЧ 
ImageURLCache рдХреИрд╢, 
ImageURLCache рд╡рдВрд╢рдЬ рдХрд╛ 
URLCache , рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдХрддрд╛рд░ рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╕реБрдЦрдж рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдХреИрд╢ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдФрд░ рдбрд┐рд╕реНрдХ рдкрд░ рдЕрдиреНрдп 
URLCache рд╕рдВрд╕реНрдерд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
 private static let accessQueue = DispatchQueue( label: "image-urlcache-access" ) override func cachedResponse(for request: URLRequest) -> CachedURLResponse? { return ImageURLCache.accessQueue.sync { return super.cachedResponse(for: request) } } override func storeCachedResponse(_ response: CachedURLResponse, for request: URLRequest) { ImageURLCache.accessQueue.sync { super.storeCachedResponse(response, for: request) } } 
рдХреЗрд╡рд▓ iOS 9 рдХреЗ рд╕рд╛рде рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред 
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рджреБрд░реНрд▓рдн рд▓реЗрдХрд┐рди рдЕрдкреНрд░рд┐рдп рдХреНрд░реИрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдХреЛ 
startLoading рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдореЗрдВ 
startLoading рдФрд░ рдлрд┐рд░ рдЗрд╕ рдереНрд░реЗрдб рдкрд░ рд╕реАрдзреЗ рдбрд╛рдЙрдирд▓реЛрдб рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
 var thread: Thread! override func startLoading() { guard let url = request.url, let components = URLComponents(url: url, resolvingAgainstBaseURL: false), let queryItems = components.queryItems else { fail(with: .badURL) return } thread = Thread.current if let cachedResponse = cachedResponse { complete(with: cachedResponse) } else { load(request: request, url: url, queryItems: queryItems) } } 
 func handle(snapshot: MKMapSnapshotter.Snapshot?, error: Error?) { thread.execute { if let snapshot = snapshot, let data = snapshot.image.jpegData(compressionQuality: 0.7) { self.complete(with: data) } else if let error = error { self.fail(with: error) } } } 
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрдм рдХрд╛рдо рдЖ рд╕рдХрддрд╛ рд╣реИ?
рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ iOS рдХреЗ рд▓рдЧрднрдЧ рд╣рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрддреНрд╡ рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ 
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореАрдбрд┐рдпрд╛ рдХреЛ рдЧреИрд▓рд░реА рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, 
URL рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдФрд░ рдЪреБрдирд╛рд╡реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдкрдиреЗ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреА рддрд╕реНрд╡реАрд░реЛрдВ рд╕реЗ рдмрдирд╛ рдЪреИрдЯ рдЕрд╡рддрд╛рд░ рднреА рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред
рдХрд┐рд╕реА рднреА рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣, 
URLProtocol рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рд╣реИрдВред
URLProtocol рдиреБрдХрд╕рд╛рди
- рд╕рдЦреНрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЕрднрд╛рд╡ - URLрдмрдирд╛рддреЗ рд╕рдордпURLрд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреАрдо рдФрд░ рд▓рд┐рдВрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдПрдХ рдЯрд╛рдЗрдкреЛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рдВрдЫрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдбреАрдмрдЧрд┐рдВрдЧ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред VKontakte рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рд╣рдо рд╡рд┐рд╢реЗрд╖URLBuilderрдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдВрддрд┐рдоURLрдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рдирд┐рд░реНрдгрдп рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рдХреНрд╖реНрдп рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдХреЛрдИ рдмреЗрд╣рддрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╕реНрдЯрдоURLрдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖URLBuilderрд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЧрд▓рддреА рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
- рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рдХреНрд░реИрд╢ - рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХреБрдЫ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ URLProtocolрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдФрд░ рднреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдпрд╛ рддреЛ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рдкрдврд╝рдиреЗ, рдпрд╛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХрд╛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░рдХреЗ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрдбрд╝ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
URLProtocol рдХреЗ рд▓рд╛рдн
- рдХрдордЬреЛрд░ рдШрдЯрдХ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА - рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдкрд╣рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рди рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреИрд╢рд┐рдВрдЧ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ URL- рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВред
- рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕рд╛рджрдЧреА - URLрдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП , рдпрд╣ рдХрдИ рд╕рд░рд▓ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдЖрд╡реЗрджрди рдореЗрдВ рдХрд╣реАрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- тАФ , , URL-.URL,URLSession,URLSessionDataTask.
- тАФ URL-URL-,URL Loading System.
- * API тАФ . , API, - , URL-. , API , .URL-http/https.
URL - тАФ . . - , - , , , тАФ , . , , тАФ 
URL .
GitHub