рдЖрдкрдХреЛ рдмрд╕ URL рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдЫрд╡рд┐

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

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


All Articles