рдпрд╣ рд▓реЗрдЦ рд▓реЗрдЦ рдХрд╛ рдПрдХ рдЕрдкрдбреЗрдЯ рд╣реИ
iOS рдореЗрдВ рджреВрд░рд╕реНрде рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ , рдирд╡рдВрдмрд░ 2015 рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рдиреИрддрд┐рдХ рд░реВрдк рд╕реЗ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реИред рдЕрдм, рдХреЛрдб рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯ 3 рдФрд░ рдЖрдИрдУрдПрд╕ 10 рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ (рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╕реНрд╡рд┐рдлреНрдЯ 4.1 рдФрд░ рдЖрдИрдУрдПрд╕ 11 рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдХрдВрдкреНрдпреВрдЯрд░ рдЕрдм рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред
рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рд┐рджреНрдзрд╛рдВрдд
рдпреВрдЖрд░рдПрд▓ рдкреНрд░рд╛рд░реВрдк
http://www.google.com/?q=Hello&safe=off
- http рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдХрд┐рд╕ рдорд╛рдирдХ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк: https, ftp, file
www.google.com
- рдбреЛрдореЗрди рдирд╛рдо- / - рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдЬрд┐рди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рд╡реЗ рд╕реНрдерд┐рдд рд╣реИрдВред
- рдкреНрд░рд╢реНрдирд╡рд╛рдЪрдХ рдЪрд┐рд╣реНрди (?) рдХреЗ рдмрд╛рдж рдкреИрд░рд╛рдореАрдЯрд░ q = рдирдорд╕реНрддреЗ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд = рдмрдВрдж рдкрд░ рдЬрд╛рдПрдВред рдЗрдирдореЗрдВ рдХреА-рд╡реИрд▓реНрдпреВ рдкреЗрдпрд░ рд╣реЛрддреЗ рд╣реИрдВред
- рдЕрдиреБрд░реЛрдз рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рднреА рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЛ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХ GET рд╡рд┐рдзрд┐ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЗрд╕ url рдХреЛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: GET рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ http рдЕрдиреБрд░реЛрдз google.com рдХреЛ рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рджреЛ q рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИрд▓реЛ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЗ рд╕рд╛рде рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
http рд╣реИрдбрд░
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдпреВрдЖрд░рдПрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╣реЗрдбрд░ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред Http рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рд╢рд░реАрд░ рдЦрд╛рд▓реА рд╣реИ, рдФрд░ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ
GET /?q=Hello&safe=off HTTP/1.1 Host: google.com Content-Length: 133 // //
рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдз рдЖрд░реЗрдЦ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИред
рд╕рддреНрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐
рд╕рднреА UI рдСрдкрд░реЗрд╢рди (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ) рдореБрдЦреНрдп рдереНрд░реЗрдб рдореЗрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЬрдм рддрдХ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрдм рдЖрдк рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рд▓реЗ рдФрд░ рд░реЛрдХ рдирд╣реАрдВ рд╕рдХрддреЗред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рдерд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдСрдкрд░реЗрд╢рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдиреЙрди-рд╕реНрдЯреЙрдк рдЪрд▓рддрд╛ рд╣реИред рдЬрдм рдЖрд╡рд╢реНрдпрдХ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рджреВрд╕рд░рд╛ рдЙрдкрд╛рдп рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдПрдХ рдирдпрд╛ рд╕реВрддреНрд░ рдмрдирд╛рдирд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдореВрд▓ рдкреБрд╕реНрддрдХ рдореЗрдВ, рд╣рдо рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рдВрдЪрд╛рд▓рди рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЛрдб рдмреНрд▓реЙрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИред
рд╕рддреНрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг
рд╣рдо
NSURLSessionDownloadDelegate рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рддрд░реАрдХреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
URLSession: downloadTask: didFinishDownloadingToURL редред рдпрд╣реА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдПрдХ рдордЬрд╝рд╛рдХ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рдбрд╛рдЙрдирд▓реЛрдб рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВред
рдореБрдЦреНрдп рдзрд╛рд░рд╛ рдореЗрдВ рд╕рдВрдХреНрд░рдордг
рдЕрд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдореБрдЦреНрдп рдзрд╛рд░рд╛ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреВрдЖрдИ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдореБрдЦреНрдп рдзрд╛рд░рд╛ рдореЗрдВ рдЬрд╛рдПрдВрдЧреЗред
рднрдЧреЛрдбрд╝рд╛ рдмрдВрдж (@ рдмрдЪ)
рдЪреВрдВрдХрд┐, рдХреЛрдб рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрд╛рд░рдг, рд╣рдо рдХреНрд▓реЛрдЬрд▓ рдЬреЛ рдХрд┐ url рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рд╡рд┐рдзрд┐ рдЦреБрдж рдмрдЪреЗрдЧреА, рд╕реНрд╡рд┐рдлреНрдЯ 3 рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ @ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рд╕реНрд╡рдпрдВ рдЗрд╕реЗ рдЕрдирдЬрд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рдХрд┐ рд╕реНрд╡рдпрдВ рд▓рд┐рдВрдХ рдЗрд╕ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рдХреИрдкреНрдЪрд░ рдФрд░ рдкрдХрдбрд╝ рди рд╕рдХреЗред рд▓реЗрдХрд┐рди рдпреЗ рд╕реНрд╡рдпрдВ рд╕реНрд╡рд┐рдлреНрдЯ рднрд╛рд╖рд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рд╣реИрдВ, рди рдХрд┐ рдПрдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рддрдХрдиреАрдХред
рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢ (рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢)
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢ рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЫреЛрдЯрд╛ рдпреВрдЖрд░рдПрд▓ рд╣реИ, рддреЛ рдЬрдм рд╣рдо рдЗрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЦреЛрдЬ рдмрд╛рд░ рдореЗрдВ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдЗрд╕ рдЫреЛрдЯреЗ рдпреВрдЖрд░рдПрд▓ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдХреЗ рд╣рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдо рдкреВрд░реНрдг рдпреВрдЖрд░рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдХреНрд╖реНрдп рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╣рдо
NSURLSessionTaskDelegate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ,
NSURLSession рд╕рднреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред
рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рд╕реНрдХреАрдо
рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕рд╛рдордЧреНрд░реА рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рднрдВрдбрд╛рд░рдг рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреЛ рдХрдо рдЬрдЧрд╣ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдирд░реА рдлреЙрд░реНрдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ JSON (рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдиреЛрдЯреЗрд╢рди) рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВред
JSON рдЙрджрд╛рд╣рд░рдг:
{ "name": "Martin Conte Mac Donell", "age": 29, "username": "fz" }
рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рдЕрдВрджрд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдореБрдЦреНрдп-рдореВрд▓реНрдп рд╡рд╛рд▓реЗ рдЬреЛрдбрд╝реЗ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдкреАрдЖрдИ (рдПрдкреНрд▓реАрдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕)
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдкреАрдЖрдИ рдХреЛ рдЙрд╕ рдкрддреЗ рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗ рд╣рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪреБрдЯрдХреБрд▓реЗ рдФрд░ JSON рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рд░реВрдк рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
http:
рдЙрджрд╛рд╣рд░рдг icndb рдПрдкреАрдЖрдИ:
{ "type": "success", "value": { "id": 201, "joke": "Chuck Norris was what Willis was talkin' about" } }
рдЕрдм рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ
рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛, рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА рддрд░рд╣, рдПрдХ рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛, рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рд╣реИред рд╕рднреА рдХреЛрдб 3 рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ:
AppDelegate.swift ,
MainViewController.swift рдФрд░
HTTPCommunication.swift ред AppDelegate.swift рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИред HTTPCommunication.swift рдХрдиреЗрдХреНрд╢рди (рдЕрдиреБрд░реЛрдз, рд╕рддреНрд░) рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред MainViewController.swift рдореЗрдВ, рдпрд╣ рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХреНрд░рдордмрджреНрдз рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛрдб рднреА рд╣реИред
рдПрдХ рдЦрд╛рд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓
iPhone рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред рд╣рдо
ViewController.swift ,
Main.storyboard рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░
Info.plist рдореЗрдВ рд╣рдо рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рднреА рд╣рдЯрд╛
рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рд╣реИ рд▓рд╛рдЗрди
рдореЗрди рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдлрд╝рд╛рдЗрд▓ рдмреЗрд╕ рдирд╛рдо - рд╕реНрдЯреНрд░рд┐рдВрдЧ - рдореЗрди ред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, iOS рдкрд░
рдРрдк рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдирд┐рдпрдорд┐рдд http (https рдирд╣реАрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░
Info.plist рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
Info.plist рдХреЛ
рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЛрд▓реЗрдВ, рдлрд┐рд░ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <false/> <key>NSExceptionDomains</key> <dict> <key>api.icndb.com</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict>
рд╣рдо, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдордирдорд╛рдиреЗ рдбрд╛рдЙрдирд▓реЛрдб рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рддреЗ рд╣реИрдВ: NSAllowsArbiteathLoads рдХреБрдВрдЬреА рдЧрд▓рдд рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдбреЛрдореЗрди рдХреЛ рдЪреБрдЯрдХреБрд▓реЗ рдФрд░ рд╕рднреА рдЙрдк рдбреЛрдореЗрди рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ: рдкреНрд░рдореБрдЦ рдорд╛рди NSExceptionDomainsред
рдЕрдм
AppDelegate.swift рдореЗрдВ рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ
рд╣реИрдВ (_: didFinishLaunchingWithOptions :) рдЬреИрд╕реЗ:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { self.window = UIWindow(frame: UIScreen.main.bounds)
HTTPCommunication.swift рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред рдФрд░ рд╣рдо рдЗрд╕рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред
import UIKit // NSObject, (conform) NSObjectProtocol, // URLSessionDownloadDelegate , // , . class HTTPCommunication: NSObject { // completionHandler - , // // . var completionHandler: ((Data) -> Void)! // retrieveURL(_: completionHandler:) // url func retrieveURL(_ url: URL, completionHandler: @escaping ((Data) -> Void)) { } } // , NSObject // (conforms) URLSessionDownloadDelegate, // // . extension HTTPCommunication: URLSessionDownloadDelegate { // // . func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { } }
рдЕрдм рд╣рдо рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗред
рдХреЛрдб
рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (_ url:, рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ :) // , // @escaping. func retrieveURL(_ url: URL, completionHandler: @escaping ((Data) -> Void)) { self.completionHandler = completionHandler let request: URLRequest = URLRequest(url: url) let session: URLSession = URLSession(configuration: .default, delegate: self, delegateQueue: nil) let task: URLSessionDownloadTask = session.downloadTask(with: request) // , // . task.resume() }
рдХреЛрдб рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдВ
urlSession (_ рд╕рддреНрд░:, рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:, didFinishDownloadingTo :) func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { do { // // . // , try, // do {} catch {} let data: Data = try Data(contentsOf: location) // completionHandler . // , // , // , . DispatchQueue.main.async(execute: { self.completionHandler(data) }) } catch { print("Can't get data from location.") } }
рд╣рдо
MainViewController.swift рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдореНрди рдХреЛрдб рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рддрд╛ рд╣реИ:
import UIKit class MainViewController: UIViewController { lazy var jokeLabel: UILabel = { let label: UILabel = UILabel(frame: CGRect.zero) label.lineBreakMode = .byWordWrapping label.textAlignment = .center label.numberOfLines = 0 label.font = UIFont.systemFont(ofSize: 16) label.sizeToFit() self.view.addSubview(label) return label }() // . var jokeID: Int = 0 // ActivityView , // , . lazy var activityView: UIActivityIndicatorView = { let activityView: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .gray) activityView.hidesWhenStopped = true activityView.startAnimating() view.addSubview(activityView) return activityView }() lazy var stackView: UIStackView = { let mainStackView: UIStackView = UIStackView(arrangedSubviews: [self.jokeLabel]) // mainStackView.spacing = 50 mainStackView.axis = .vertical mainStackView.distribution = .fillEqually self.view.addSubview(mainStackView) return mainStackView }() override func viewDidLoad() { super.viewDidLoad() self.title = "Chuck Norris Jokes" // stackView activityView, // . // stackView // label. self.configConstraints() // (E.2) // // . self.retrieveRandomJokes() // (E.3) } func retrieveRandomJokes() { } } extension MainViewController { func configConstraints() { // autoresizingMask (constraints) // false, // self.stackView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ self.stackView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor), self.stackView.leadingAnchor.constraint(equalTo: self.view.layoutMarginsGuide.leadingAnchor), self.stackView.trailingAnchor.constraint(equalTo: self.view.layoutMarginsGuide.trailingAnchor) ]) self.activityView.translatesAutoresizingMaskIntoConstraints = false // (constraints) activityView, // label: X Y // label X Y. NSLayoutConstraint.activate([ self.activityView.centerXAnchor.constraint(equalTo: self.jokeLabel.centerXAnchor), self.activityView.centerYAnchor.constraint(equalTo: self.jokeLabel.centerYAnchor) ]) } }
рд╣рдордиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛, рдЕрдм рдЖрдк рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рднрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ
рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рд╣реИрд╡реГрджреНрдзрд┐рдорд╛рди рдЬреЛрдХреНрд╕ () рдХреЛрдб
func retrieveRandomJokes() { let http: HTTPCommunication = HTTPCommunication() // url , force unwrap // url , let url: URL = URL(string: "http://api.icndb.com/jokes/random")! http.retrieveURL(url) { // self , weak self [weak self] (data) -> Void in // json // , , . // json , // . guard let json = String(data: data, encoding: String.Encoding.utf8) else { return } // : JSON: { "type": "success", "value": // { "id": 391, "joke": "TNT was originally developed by Chuck // Norris to cure indigestion.", "categories": [] } } print("JSON: ", json) do { let jsonObjectAny: Any = try JSONSerialization.jsonObject(with: data, options: []) // , Any // , . guard let jsonObject = jsonObjectAny as? [String: Any], let value = jsonObject["value"] as? [String: Any], let id = value["id"] as? Int, let joke = value["joke"] as? String else { return } // , // . self.activityView.stopAnimating() self.jokeID = id self.jokeLabel.text = joke } catch { print("Can't serialize data.") } } }
рдЕрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдПрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рдЬрдмрдХрд┐ рд╣рдо рд╕рд╛рдЗрдЯ рд╕реЗ рдордЬрд╛рдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, рдордЬрд╛рдХ рдХреЛ рд▓реЛрдб рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдП рдмрд┐рдирд╛ рдирдП рдЪреБрдЯрдХреБрд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЪреБрдЯрдХреБрд▓реЗ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рджреЗрддрд╛ рд╣реИред