рдХрдВрдмрд╛рдЗрди рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓
Swift
рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ
Xcode 11
рд╕рд╣рд┐рдд рд╕рднреА
Apple
рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдХрдВрдмрд╛рдЗрди рдХреЗ рд╕рд╛рде
, рд╕рдордп рдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдФрд░ рдЬрдЯрд┐рд▓ рдиреЗрд╕реНрдЯреЗрдб
рдХреЙрд▓рдмреИрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЛ рднреА рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ
рдХреЙрдореНрдмрд┐рдиреЗрд╢рди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХреЙрдореНрдмрд╛рдЗрди рдХреЗ рдореБрдЦреНрдп "рдЦрд┐рд▓рд╛рдбрд╝реА" "рдкреНрд░рдХрд╛рд╢рдХ"
рдкреНрд░рдХрд╛рд╢рдХ , "рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░"
рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдФрд░
рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рдЕрдореВрд░реНрдд рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдмрд┐рдирд╛
рдХреЙрдореНрдмрд┐рдиреЗрд╢рди рдХреЗ рддрд░реНрдХ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐
Apple
рддреИрдпрд╛рд░-рдХрд┐рдП рдЧрдП "рдкреНрд░рдХрд╛рд╢рдХреЛрдВ", "рдЧреНрд░рд╛рд╣рдХреЛрдВ" рдФрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ,
рдХреЙрдореНрдмрд╛рдЗрди рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдХреЛрдб рдмрд╣реБрдд рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрдардиреАрдп рд╣реИред
рдЕрдм рдЖрдк рдЗрд╕реЗ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп
TMDb рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ
рдореВрд╡реА рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ
рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред рд╣рдо рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВрдЧреЗ:
UIKit рдФрд░
SwiftUI , рдФрд░ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐
рдХреЙрдореНрдмрд╛рдЗрди рдЙрдирдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдЖрдкрдХреЛ
рдХреЙрдореНрдмрд┐рдиреЗрд╢рди рд╕реАрдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╣реЛрдЧреАред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб
рдЬреАрдердм рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрдВрдмрд╛рдЗрди рдХреЗ рдХрдИ рдореБрдЦреНрдп рдШрдЯрдХ рд╣реИрдВ:
рдкреНрд░рдХрд╛рд╢рдХ рдкреНрд░рдХрд╛рд╢рдХ ред

рдкреНрд░рдХрд╛рд╢рдХреЛрдВ рдХреЗ
рдкреНрд░рдХрд╛рд╢рдХ TYPES рд╣реИрдВ рдЬреЛ рдЙрди рд╕рднреА рдХреЛ
рдорд╛рди рдкреНрд░рджрд╛рди
рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░рдХрд╛рд╢рдХ рдХреА "рдкреНрд░рдХрд╛рд╢рдХ" рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ TYPE рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкреНрд░рдХрд╛рд╢рдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдореВрд▓реНрдп рдФрд░
рд╡рд┐рдлрд▓рддрд╛ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЬреЗрдиреЗрд░рд┐рдХ TYPES рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред
рдПрдХ "рдкреНрд░рдХрд╛рд╢рдХ" рдЬреЛ рдХрднреА рднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ,
рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП TYPE
Never рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


Apple
рддреИрдпрд╛рд░-рдХрд┐рдП рдЧрдП "рдкреНрд░рдХрд╛рд╢рдХреЛрдВ" рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
рдмрд╕ ,
рднрд╡рд┐рд╖реНрдп ,
рдЦрд╛рд▓реА ,
рд╕реНрдердЧрд┐рдд ,
рдЕрдиреБрдХреНрд░рдо ,
@ рдкреНрд░рдХрд╛рд╢рд┐рдд , рдЖрджрд┐ред "рдкреНрд░рдХрд╛рд╢рдХ" рдХреЛ
рдлрд╝рд╛рдЙрдВрдбреЗрд╢рди рдХреНрд▓рд╛рд╕реЗрд╕ рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ:
URLSession , <
NotificationCenter ,
рдЯрд╛рдЗрдорд░ ред
"рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░" рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ ред

рдпрд╣ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рднреА рд╣реИ рдЬреЛ рдПрдХ "рдкреНрд░рдХрд╛рд╢рдХ" рд╕реЗ
рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП "рд╕рджрд╕реНрдпрддрд╛" рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ
рдЗрдирдкреБрдЯ рдФрд░
рд╡рд┐рдлрд▓рддрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЗрдиреЗрд░рд┐рдХ TYPES рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдкреНрд░рдХрд╛рд╢рдХ
рдкреНрд░рдХрд╛рд╢рдХ рдФрд░
рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдХрд╛ TYPES рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд╢рдХ рдкреНрд░рдХрд╛рд╢рдХ рдХреЗ рд▓рд┐рдП, рджреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд
рдЧреНрд░рд╛рд╣рдХ рд╣реИрдВ :
рд╕рд┐рдВрдХ рдФрд░
рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ :

"рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░"
рд╕рд┐рдВрдХ рджреЛ рдХреНрд▓реЛрдЬрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ: рдПрдХ рдХреНрд▓реЛрдЬрд░,
рд░рд┐рд╕реАрд╡реНрдпреВ , рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдЖрдк "
рдкрдмреНрд▓рд┐рд╢рд┐рдВрдЧ " (рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде) рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛
рд╣реИ , рддреЛ рджреВрд╕рд░реА рдХреНрд▓реЛрдЬрд░,
рд░рд┐рд╕реАрдкреНрд▓рд┐рдореЗрдВрдЯреЗрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

"рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░"
рдЕрд╕рд╛рдЗрди , рдирд┐рд░реНрджрд┐рд╖реНрдЯ
key Path
рдУрд░ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред
"рд╕рджрд╕реНрдпрддрд╛" рд╕рджрд╕реНрдпрддрд╛ ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, "рдкреНрд░рдХрд╛рд╢рдХ"
рдкреНрд░рдХрд╛рд╢рдХ "
рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ " рд╕рдмрд╕реНрдХреНрд░рд╛рдЗрдмрд░ рдХреЛ "
рдкреНрд░рд╛рдкреНрдд "
рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдХреЛ рдЙрд╕рдХреЗ
рдкреНрд░рд╛рдкреНрдд (рд╕рджрд╕реНрдпрддрд╛ :) рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рддрд╛ рдФрд░ рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:

рдЙрд╕рдХреЗ рдмрд╛рдж,
рд╕рджрд╕реНрдпрддрд╛ рджреЛ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░реНрд╕
рдХреЗ "рдЧреНрд░рд╛рд╣рдХреЛрдВ"
рдХреЛ рдЕрдкрдирд╛
рдорд╛рди рднреЗрдЬ рд╕рдХрддреА рд╣реИ:

рдпрджрд┐ рдЖрдкрдиреЗ
рд╕рджрд╕реНрдпрддрд╛ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХреА
рд░рджреНрдж () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

"рд╡рд┐рд╖рдп" рд╡рд┐рд╖рдп ред

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

рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд╢рдХ "рдкреНрд░рдХрд╛рд╢рдХ" рд╕реЗ рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд╢рдХ "рдкреНрд░рдХрд╛рд╢рдХ" рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдИ рдкрд┐рдЫрд▓реЗ
upstream
рдкрдмреНрд▓рд┐рд╢рд░реНрд╕ рд╕реЗ рдХрдиреНрд╡рд░реНрдЬрд╝рди, рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐
рд╡реИрд▓реНрдпреВрдЬрд╝ рдХреЛ рдЬреЛрдбрд╝рдХрд░ред

рдЖрдк рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд░рд┐рдЪрд┐рдд рдСрдкрд░реЗрдЯрд░ рдирд╛рдо рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ:
рдХреЙрдореНрдкреИрдХреНрдЯ рдореИрдк ,
рдореИрдк ,
рдлрд╝рд┐рд▓реНрдЯрд░ ,
рдбреНрд░реЙрдк рдлрд╝рд░реНрд╕реНрдЯ ,
рдПрдкреЗрдВрдб ред
рдлрд╛рдЙрдВрдбреЗрд╢рди рдкреНрд░рдХрд╛рд╢рдХ рдкрдмреНрд▓рд┐рд╢рд░реНрд╕ рдлрд╛рдЙрдВрдбреЗрд╢рди рдореЗрдВ рдмрдирд╛рдпрд╛ред
Apple
,
рдлрд╛рдЙрдВрдбреЗрд╢рди <
рдвреНрдбрд╣реНрдо > рдореЗрдВ рдХрдИ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд
рдХрдВрдмрд╛рдЗрди рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдкрдмреНрд▓рд┐рд╢рд░реНрд╕ рдкрдмреНрд▓рд┐рд╢рд░реНрд╕ рд╣реИрдВ, рдЬреЛ
URLSession рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП,
рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди ,
рдЯрд╛рдЗрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП
рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ
, рдФрд░
KVO рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЧреБрдгреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдВрдЧрддрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реА рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ
рдХрдВрдмрд╛рдЗрди рдврд╛рдВрдЪреЗ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧреАред
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП,
"рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рдЕрдВрддрд┐рдо рд╕рдВрдпреЛрдЬрди рд░реВрдкрд░реЗрдЦрд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓" рд▓реЗрдЦ рджреЗрдЦреЗрдВред
рд╣рдо рдХрдВрдмрд╛рдЗрди рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╕реАрдЦрддреЗ рд╣реИрдВ?
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдпрд╣ рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐
рдЯреАрдПрдордбреАрдмреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рдореВрд╡реА рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП
рдХрдВрдмрд╛рдЗрди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдпрд╣рд╛рдБ рд╣рдо рдПрдХ рд╕рд╛рде рдЕрдзреНрдпрдпрди рдХрд░реЗрдВрдЧреЗ:
- "рдкреНрд░рдХрд╛рд╢рдХ" рднрд╡рд┐рд╖реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХрд▓ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рд╡рд╛рджрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд░реАрдмреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП: рдпрд╛ рддреЛ рдореВрд▓реНрдп рдпрд╛ рддреНрд░реБрдЯрд┐ред
- рдХрд┐рд╕реА рджрд┐рдП рдЧрдП
UR
L рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдбреЗрдЯрд╛ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП "рдкреНрд░рдХрд╛рд╢рдХ" URLSession.datataskPublisher рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рд╕рджрд╕реНрдпрддрд╛" рд▓реЗрдВред - рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд╢рдХ рдкреНрд░рдХрд╛рд╢рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдбреЗрдЯрд╛ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП tryMap рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
- рдбрд┐рдХреЛрдб рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛ рдбреЗрдЯрд╛ рдХреЛ рдбрд┐рдХреЛрдбреЗрдмрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓рдиреЗ рдФрд░ рдЪреЗрди рдХреЗ рдмрд╛рдж рдХреЗ рддрддреНрд╡реЛрдВ рддрдХ рд╕рдВрдЪрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред
- рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХрд╛рд╢рдХ "рдкреНрд░рдХрд╛рд╢рдХ" рдХреЛ "рд╕рджрд╕реНрдпрддрд╛" рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
- рдкреНрд░рдХрд╛рд╢рдХ "рдкреНрд░рдХрд╛рд╢рдХ" рдХреЛ "рд╕рджрд╕реНрдпрддрд╛" рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдХрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рджрд┐рдП рдЧрдП
key Path
рдХреЛ рдЗрд╕рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░реЗрдВред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛
рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ
TMDb рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░
API
рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдкрдХреЛ
GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреА
API
рдХреБрдВрдЬреА рдХреЛ
рдореВрд╡реАрд╕реНрдЯреЛрд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ
рдПрдкреАрдХреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ рд░рдЦреЗрдВред

рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВрдЧреЗ:
- 1.
Movie.swift
рдЕрдВрджрд░ред Movie.swift
рдлрд╝рд╛рдЗрд▓ рдРрд╕реЗ рдореЙрдбрд▓ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд░реЗрдВрдЧреЗред рд╕реНрдЯреНрд░рдХреНрдЪрд░рд▓ рдореВрд╡реАрд╕реНрдкреЗрд╕ рдХреА рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдбрд┐рдХреЛрдбреЗрдмрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ, рдФрд░ JSON
рдбреЗрдЯрд╛ рдХреЛ рдореЙрдбрд▓ рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдкрд░ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред MoviesResponse рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдбрд┐рдХреЛрдбреЗрдмрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ рдФрд░ рдлрд┐рд▓реНрдореЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ [рдореВрд╡реА] ред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд░реБрдЪрддрд╛ рд╣реИ:

- 2. Enum рдЧрдгрди MovieStoreAPIError рддреНрд░реБрдЯрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реА
API
рдЗрд╕ рдЧрдгрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧреА: URL
рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рддреНрд░реБрдЯрд┐рдпрд╛рдВ urlError , decodingError рдбрд┐рдХреЛрдбрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпрд╛рдВ, рдФрд░ рдкреНрд░рддрд┐рд╕рд╛рдж рдбреЗрдЯрд╛ рдбреЗрдЯрд╛ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред

- 3. рд╣рдорд╛рд░реЗ
API
рдореЗрдВ рдПрдХ рдПрдХрд▓ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдореВрд╡реА рд╕рд░реНрд╡рд┐рд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ, рднреНрд░реВрдг (рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╕реЗ: рдПрдВрдбрдкреЙрдЗрдВрдЯ) , рдЬреЛ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ [рдореВрд╡реА] рдлрд┐рд▓реНрдореЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╕реНрд╡рдпрдВ рдПрдХ рдПрдирдо рдПрдирдо рд╣реИ рдЬреЛ TMPb рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЕрдм рдлрд┐рд▓реНрдореЗрдВ (рдирд╡реАрдирддрдо), рд▓реЛрдХрдкреНрд░рд┐рдп (рд▓реЛрдХрдкреНрд░рд┐рдп), рдЯреЙрдк рд░реЗрдЯреЗрдб (рд╢реАрд░реНрд╖) рдФрд░ рдЖрдЧрд╛рдореА (рд╕реНрдХреНрд░реАрди рдкрд░ рдЬрд▓реНрдж рд╣реА рдЖрдиреЗ рд╡рд╛рд▓реА )ред

- 4. рдореВрд╡реАрд╕реНрдЯреЛрд░ рдХреНрд▓рд╛рд╕ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ TMDb рд╕рд╛рдЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд╡реА рд╕рд░реНрд╡рд┐рд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░, рд╣рдо рдХреЙрдореНрдмрд┐рдиреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ fetchMovies (...) рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

- 5. MovieListViewController рдХреНрд▓рд╛рд╕ рдореБрдЦреНрдп ViewController рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо fetchMovies (...) рдореВрд╡реА рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рднрд╡рд┐рд╖реНрдп рдХрд╛ "рдкреНрд░рдХрд╛рд╢рдХ" рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдирдП рдореВрд╡реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде TableView рдЯреЗрдмрд▓ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдирдИ DiffableDataSourceSnapshot
API
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд┐рд▓реНрдореЗрдВ ред
рдЖрд░рдВрдн рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рд╣рдо рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА
рд╕рдВрдпреЛрдЬрди рдШрдЯрдХреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рджреВрд░рд╕реНрде рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐
API
ред
рд╕рд┐рдВрдХ рдФрд░ рдЗрд╕рдХреЗ рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рдкреНрд░рдХрд╛рд╢рдХ" рдХреЗ рд▓рд┐рдП "рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ"ред
рдкреНрд░рдХрд╛рд╢рдХ рдХреЗ "рдкреНрд░рдХрд╛рд╢рдХ" рдХреЛ "рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм" рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд╛рде
рд╕рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЬрдм рднреА рд╣рдо рдПрдХ рдирдпрд╛
рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рджреВрд╕рд░реЗ рдХреЛ "рдкреНрд░рдХрд╛рд╢рдХ"
рдорд╛рдиреЛрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐
рдХрдВрдмрд╛рдЗрди рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ "рд╕рджрд╕реНрдпрддрд╛" рдПрдХ
рдХреИрдВрд╕реЗрд▓реЗрдмрд▓ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЬреИрд╕реЗ рд╣реА рд╣рдо рдЕрдкрдирд╛ рд╕рдВрджрд░реНрдн рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ, рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХ рд╕рдордп рддрдХ "рд╕рджрд╕реНрдпрддрд╛" рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
рд╕рдмрд╕реНрдХреНрд░рд┐рдкреНрд╢рди 1 рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ "рд╕рджрд╕реНрдпрддрд╛" рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рд╕рднреА
рдореВрд▓реНрдпреЛрдВ (7,8,3,4) рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐
рдорд┐рд▓реА ред
рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ "рдПрдХрд▓" рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ: рдпрд╛ рддреЛ рдореВрд▓реНрдп рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рддреНрд░реБрдЯрд┐ред
рдХрдВрдмрд╛рдЗрди рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ, "рдкреНрд░рдХрд╛рд╢рдХ"
рдлреНрдпреВрдЪрд░ рдХреЛ рдПрдХ рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХрд▓ TYPE
рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ -
рд╡рд╛рджрд╛ , рдЬреЛ TYPE
(рдкрд░рд┐рдгрд╛рдо <рдЖрдЙрдЯрдкреБрдЯ, рд╡рд┐рдлрд▓рддрд╛>) рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ
-> рд╢реВрдиреНрдп ред
рдЖрдЗрдП
рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреНрд░рдХрд╛рд╢рдХ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

рд╣рдо TYPE
Int рдХреЗ рд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдо рдФрд░ TYPE
Never рдХреА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде
Future рдмрдирд╛рддреЗ рд╣реИрдВред
рдлреНрдпреВрдЪрд░ рдХреНрд▓реЛрдЬрд░ рдХреЗ рдЕрдВрджрд░, рд╣рдо рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ
2 рд╕реЗрдХрдВрдб рдХреА рджреЗрд░реА рдХреЗ рд▓рд┐рдП
DispatchQueue.main.asyncAfter (...) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рд╣реЛрддрд╛ рд╣реИред рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдЕрдВрджрд░, рд╣рдо
0 рдФрд░
100 рдХреЗ рдмреАрдЪ рд╕реАрдорд╛ рдореЗрдВ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреВрд░реНрдгрд╛рдВрдХ
рдЗрдВрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ
рд╡рд╛рджреЗ рдХреЗ рд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдо
(.success (...)) рдХреЗ рд╕рд╛рде
рд╡рд╛рджрд╛ рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рд╣рдо рджреЛ
рднрд╛рд╡реА рд╕рджрд╕реНрдпрддрд╛рдПрдБ -
рд░рджреНрдж рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдФрд░
рд░рджреНрдж рдХрд░рдиреЗ рдпреЛрдЧреНрдп 1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдФрд░ рджреЛрдиреЛрдВ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдВрджрд░ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред
1.
рдпрд╣ 1.
рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ "рдкреНрд░рдХрд╛рд╢рдХ" рдореЗрдВ рдЕрдиреНрдп "рдкреНрд░рдХрд╛рд╢рдХреЛрдВ" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:
- "рдкреНрд░рдХрд╛рд╢рдХ" рднрд╡рд┐рд╖реНрдп рд╣рдореЗрд╢рд╛ "рдПрдХ рдореВрд▓реНрдп ( рдореВрд▓реНрдп рдпрд╛ рддреНрд░реБрдЯрд┐)" рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
- рднрд╡рд┐рд╖реНрдп "рдкреНрд░рдХрд╛рд╢рдХ" рдПрдХ рд╡рд░реНрдЧ (
reference type
) рд╡рд░реНрдЧ рд╣реИ, рдЕрдиреНрдп "рдкреНрд░рдХрд╛рд╢рдХреЛрдВ" рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрдирд╛ ( value type
) рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╡рд╛рджрд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ "рдкреНрд░рдХрд╛рд╢рдХ" рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рддреБрд░рдВрдд рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд╡рд╛рджрд╛ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рдЧреНрд░рд╛рд╣рдХ " рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ " рдХреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ "рдкреНрд░рдХрд╛рд╢рдХ" рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реНрдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдХреЗ "рдкреНрд░рдХрд╛рд╢рдХ" рдХреЛ рдЕрдкрдиреЗ рдХрд╛рдордХрд╛рдЬ рдХреЗ рд▓рд┐рдП "рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд╢рдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкрд╛рда "рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдВрджрд░ рд╕реЗ рдирдорд╕реНрдХрд╛рд░!" рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдореБрджреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред
- рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рдЖрд▓рд╕реА "рдкреНрд░рдХрд╛рд╢рдХреЛрдВ" ("рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ" рдХреЗрд╡рд▓ "рд╕рджрд╕реНрдпрддрд╛" рд╣реЛрдиреЗ рдкрд░) "рдкреНрд░рдХрд╛рд╢рдХ" рдПрдХ
eager
(рдЕрдзреАрд░) "рдкреНрд░рдХрд╛рд╢рдХ" рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреНрд░рдХрд╛рд╢рдХ рдиреЗ рдЕрдкрдирд╛ рд╡рд╛рджрд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛, рдкрд░рд┐рдгрд╛рдо рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╡рд░реНрддрдорд╛рди рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ "рдЧреНрд░рд╛рд╣рдХреЛрдВ" рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕реЗ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдЖрдк рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреНрд░рдХрд╛рд╢рдХ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ "рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм" рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА "рд░реИрдВрдбрдо" рд╡реИрд▓реНрдпреВ рдорд┐рд▓рддреА рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 6 , рд▓реЗрдХрд┐рди рдпрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдПрдХ рдЬреИрд╕реА рд╣реА), рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ int рдорд╛рдиред
"рдкреНрд░рдХрд╛рд╢рдХ"
рднрд╡рд┐рд╖реНрдп рдХрд╛ рдРрд╕рд╛ рддрд░реНрдХ рдЖрдкрдХреЛ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрд╕рд╛рдзрди-рдЦрдкрдд рдХреА рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдХрдИ "рд╕рджрд╕реНрдпрддрд╛" рдХреЗ рд▓рд┐рдП "рд╕рд░реНрд╡рд░" рдХреЛ рдкрд░реЗрд╢рд╛рди рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпрджрд┐
рднрд╡рд┐рд╖реНрдп рдХреЗ "рдкреНрд░рдХрд╛рд╢рдХ" рдХрд╛ рдРрд╕рд╛ рддрд░реНрдХ рдЖрдкрдХреЛ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛
рднрд╡рд┐рд╖реНрдп рдЖрд▓рд╕реА рдХрд╣рд▓рд╛рдП рдФрд░ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдкрдХреЛ рдирдП рдпрд╛рджреГрдЪреНрдЫрд┐рдХ
рдЗрдВрдЯреНрдпреВ рд╡реИрд▓реНрдпреВ рдорд┐рд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ
рднрд╡рд┐рд╖реНрдп рдХреЛ "
рдЖрд╕реНрдердЧрд┐рдд " рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

рд╣рдо
рднрд╡рд┐рд╖реНрдп рдХреЛ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреИрд╕рд╛ рдХрд┐
рдХреЙрдореНрдмрд╛рдЗрди рдореЗрдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ,
рдЕрд░реНрдерд╛рддреН , "рд╕рд╛рдЭрд╛" рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ "рдкреНрд░рдХрд╛рд╢рд┐рдд" рдЧрдгрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВред
рдиреЛрдЯ 2. рд╣рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ "рдкреНрд░рдХрд╛рд╢рдХ" рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рд╕рджрд╕реНрдпрддрд╛" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд┐рдВрдХ рд╡рд┐рдзрд┐ AnyCancellable рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд▓рдЧрд╛рддрд╛рд░ рдпрд╛рдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ Swift
рднреА рд╕рдордп рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛, рдЬреЛ рдХрд┐ main thread
рдкрд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ AnyCancellable main thread
рдкрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм AnyCancellable рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХрд╛ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "рд╕рджрд╕реНрдпрддрд╛" рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдкрдиреЗ рд╕рд┐рдВрдХ "рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди" рдХреЛ рдХреИрдВрд╕рд┐рд▓реЗрдмрд▓ <рдФрд░ cancellable1 рдпрд╛ рд╕реЗрдЯ <AnyCancellable> () рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ ред
рдЯреАрдПрдордбреАрдмреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рдлрд┐рд▓реНрдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдмрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реНрдЯрд╛рд░реНрдЯрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ
MovieStore.swift
рд╣реИрдВ рдФрд░ рдПрдХ рдЦрд╛рд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде
MovieStore.swift
рдлрд╛рдЗрд▓ рдФрд░
рднреНрд░реВрдгрдореЛрд╡рд┐рдЬрд╝ рд╡рд┐рдзрд┐ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ:
FetchMovies рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
, рд╣рдо TYPE
рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдлрд┐рд▓реНрдореЛрдВ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред TYPE
рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдПрдХ
рдПрдиреБрдо рдПрдиреНрдпреВрдорд░реЗрд╢рди рд╣реИ рдЬреЛ рдЕрдм рдорд╛рди рд▓реЗрддрд╛ рд╣реИ (рд╡рд░реНрддрдорд╛рди),
рдЖрдЧрд╛рдореА (рдЬрд▓реНрдж рд╣реА рд╕реНрдХреНрд░реАрди рдкрд░ рдЖ рд░рд╣рд╛ рд╣реИ),
рд▓реЛрдХрдкреНрд░рд┐рдп (рд▓реЛрдХрдкреНрд░рд┐рдп), рдЯреЙрдк
рд░реЗрдЯреЗрдб (рд╢реАрд░реНрд╖):

рдЪрд▓рд┐рдП рдПрдХ
callback
рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд╛рде
рднрд╡рд┐рд╖реНрдп рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рд╛рдкреНрдд
рднрд╡рд┐рд╖реНрдп рд╣рдо рдлрд┐рд░ рдзрдирд╡рд╛рдкрд╕реА рдХрд░реЗрдВрдЧреЗред

callback
рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдЕрдВрджрд░, рд╣рдо рдЬрдирд░реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
рдПрдВрдбрдкреЙрдЗрдВрдЯ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рдВрдЧрдд рдорд╛рди рдХреЗ рд▓рд┐рдП
рдЬрдирд░реЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ (рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЗ рд╕рд╛рде: рдПрдВрдбрдкреЙрдЗрдВрдЯ) рдлрд╝рдВрдХреНрд╢рди:

рдпрджрд┐ рд╕рд╣реА
URL
рдЬреЗрдирд░реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо
рд╡рд╛рджреЗ (.failure (.urlError (...)) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рддреНрд░реБрдЯрд┐
рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ , рдЕрдиреНрдпрдерд╛ рд╣рдо рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ рдФрд░ "рдкреНрд░рдХрд╛рд╢рдХ"
URLSession.dataTaskPublisher рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд
URL
рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ "рд╕рдмреНрд╕реНрдХреНрд░рд╛рдЗрдм" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
URL
рд╣рдо
URL
рд╕реЗрд╢рди рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд
рдбреЗрдЯрд╛рдЯрд╛рд╕реНрдХрдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ
URL
рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░
рдЯреНрдпреВрд▓ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛
(рдбреЗрдЯрд╛: рдбреЗрдЯрд╛, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛: URLResponse) рдФрд░
URLError рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд╢рдХ "рдкреНрд░рдХрд╛рд╢рдХ" рдХреЛ
рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдПрдХ рдкреНрд░рдХрд╛рд╢рдХ рдкреНрд░рдХрд╛рд╢рдХ рдХреЛ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд╢рдХ рдкреНрд░рдХрд╛рд╢рдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рдЯреНрд░рд╛рдЗрдкреЙрдкрд░ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ,
рдЯреНрд░рд╛рдЗрдкреЙрдкрд░ рдСрдкрд░реЗрдЯрд░ рдПрдХ рдмрдВрдж рдХреЗ рдЕрдВрджрд░ рдПрдХ
рдереНрд░реЛ рдПрд░рд░ рдПрд░рд░ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдирдпрд╛ рдкреНрд░рдХрд╛рд╢рдХ рдкреНрд░рдХрд╛рд╢рдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдо
tryMap рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
рд╕реНрдерд┐рддрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдХреА
http
рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ
рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдЗрд╕рдХрд╛ рдорд╛рди
200 рдФрд░
300 рдХреЗ рдмреАрдЪ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо
рдлреЗрдВрдХрддрд╛ рд╣реИ responserrror enum MovieStoreAPIError рдЧрдгрди рддреНрд░реБрдЯрд┐ рдорд╛рдиред рдЕрдиреНрдпрдерд╛ (рдЬрдм рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ), рд╣рдо рдХреЗрд╡рд▓ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛
рдбреЗрдЯрд╛ рдХреЛ "рдкреНрд░рдХрд╛рд╢рдХ" рд╢реНрд░реГрдВрдЦрд▓рд╛
рдХреЗ рдЕрдЧрд▓реЗ
рдкреНрд░рдХрд╛рд╢рдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВред

рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдо
рдбрд┐рдХреЛрдб рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдкрд┐рдЫрд▓реЗ "рдкрдмреНрд▓рд┐рд╢рд░" рдХреЗ рдЖрдЙрдЯрдкреБрдЯ
JSON
рдбреЗрдЯрд╛ рдХреЛ
рдлрд┐рд▓реНрдорд░рд╕реНрдкреЗрд╕ <рдореЙрдбрд▓ рдореЗрдВ
JSONDecoder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП
MovieResponse <Model рдореЗрдВ
рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ ред

...
jsonDecoder рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд┐рдерд┐ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

main thread
рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо
рдкреНрд░рд╛рдкреНрдд (рдСрди :) рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕рдХреЗ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ
RunLoop.main рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдпрд╣ "рдЧреНрд░рд╛рд╣рдХ" рдХреЛ
main
рдзрд╛рдЧреЗ рдкрд░ рдореВрд▓реНрдп
рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рд╡рд░реНрддрди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд╣реБрдВрдЪ рдЧрдП, рдФрд░ рд╡рд╣рд╛рдВ рд╣рдо рдкрдмреНрд▓рд┐рд╢рд░реНрд╕ "рдкреНрд░рдХрд╛рд╢рдХреЛрдВ" рдХреА рдЧрдард┐рдд "рд╢реНрд░реГрдВрдЦрд▓рд╛" рдХреЗ рд▓рд┐рдП "рд╕рджрд╕реНрдпрддрд╛"
рд╕рджрд╕реНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рд╕рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╕рд┐рдВрдХ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ:
- рдмрдВрдж рдкреНрд░рд╛рдкреНрдд рдЬрдм рднреА "рдкреНрд░рдХрд╛рд╢рдХ" рдкреНрд░рдХрд╛рд╢рдХ рд╕реЗ рдирдпрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рддреЛ рдЙрд╕реЗ "рдкреНрд░рдХрд╛рд╢рдХ" рдкреНрд░рдХрд╛рд╢рдХ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ ред
- getCompletion рдмрдВрдж рдХрд░рдирд╛ : (рд╡реИрдХрд▓реНрдкрд┐рдХ)ред рдЗрд╕реЗ рдкреНрд░рдХрд╛рд╢рдХ "рдкреНрд░рдХрд╛рд╢рдХ" рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕реЗ рдкреВрд░реНрдг рдЧрдгрдирд╛ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдиреЛрдВ рдХрд╛ "рдкреНрд░рдХрд╛рд╢рди" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рд╣реИред
ReceValue рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдЕрдВрджрд░, рд╣рдо рдмрд╕ рдПрдХ
рдЕрд╕рдлрд▓ рд╡рд┐рдХрд▓реНрдк рдФрд░
$ 0.results рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде
рдПрдХ рд╡рд╛рджрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд┐рд▓реНрдореЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред
GetCompletion рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдЕрдВрджрд░
, рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐
рдкреВрд░реНрдгрддрд╛ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐
рд╣реИ , рддреЛ
.failure рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдзрд┐рдд
рд╡рд╛рджрд╛ рддреНрд░реБрдЯрд┐ рдкрд╛рд╕ рдХрд░реЗрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣рд╛рдБ рд╣рдо рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ "рдкреНрд░рдХрд╛рд╢рдХ рд╢реНрд░реГрдВрдЦрд▓рд╛" рдХреЗ рдкрд┐рдЫрд▓реЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо
рд╕реЗрдЯ <AnyCancellable> () рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ "рд╕рджрд╕реНрдпрддрд╛"
рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ "рд╕рджрд╕реНрдпрддрд╛"
рд╕рджрд╕реНрдпрддрд╛ рд░рджреНрдж рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ , рдпрд╣ рдПрдХ рдРрд╕рд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ рдЬреЛ
рднреНрд░реВрдг рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рдм рдХреБрдЫ рдирд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рднреА "рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди"
рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
рднреНрд░реВрдг рдореЗрдореЛрд╡рд┐рдЬрд╝ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЪрд░ рдмрд╛рд╣рд░реА рдореЗрдВ "рд╕рджрд╕реНрдпрддрд╛"
рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо
рд╕рджрд╕реНрдпрддрд╛ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ
рд╕реЗрдЯ <AnyCancellable> () рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░
.store (рдореЗрдВ: рдФрд░ self.subscos) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ , рдЬреЛ рдХрд┐
рднреНрд░реВрдг рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рдж "рд╕рджрд╕реНрдпрддрд╛"
рдХреА рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдпрд╣
рдХреЙрдореНрдмрд┐рдиреЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
TMDb рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдлрд┐рд▓реНрдореЗрдВ рдЪреБрдирдиреЗ рдХреЗ
рд▓рд┐рдП fetchMovies рд╡рд┐рдзрд┐ рдХреЗ рдЧрдарди рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред
рднреНрд░реВрдг рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд┐рдзрд┐, рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ,
рдПрдирдо рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЧрдгрдирд╛ рдХрд╛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдХреМрди рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд┐рд▓реНрдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд░реБрдЪрд┐ рд░рдЦрддреА рд╣реИрдВ:
.nowPlaying - рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдлрд┐рд▓реНрдореЗрдВ,
.upcoming - рдлрд┐рд▓реНрдореЗрдВ рдЬреЛ рдЬрд▓реНрдж рд╣реА рдЖ рд░рд╣реА рд╣реИрдВред
ред рдкреЙрдкреБрд▓рд░ - рд▓реЛрдХрдкреНрд░рд┐рдп рдлрд┐рд▓реНрдореЗрдВ,
.topRated - рд╢реАрд░реНрд╖ рдлрд┐рд▓реНрдореЗрдВ, рдЬреЛ рдмрд╣реБрдд рдЙрдЪреНрдЪ рд░реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╣реИрдВред
рдЖрдЗрдП рдЗрд╕
API
рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп
рдпреВрдЖрдИрдХрд┐рдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде
Table View Controller
рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

рдФрд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬрд┐рд╕рдХрд╛ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдирдИ рдШреЛрд╖рдгрд╛рддреНрдордХ
рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

"рд╕рд╛рдорд╛рдиреНрдп View Controller
рдлрд┐рд▓реНрдореЛрдВ рд╕реЗ рдлрд┐рд▓реНрдореЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ"ред
рд╣рдо
MovieListViewController.swift рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░
рд╡реНрдпреВрдбреЙрд▓рдб рд╡рд┐рдзрд┐ рдореЗрдВ
fetMMies рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ
fetchMovies рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░
, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ
рд╡рд┐рдХрд╕рд┐рдд рдлрд┐рд▓реНрдордПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА
fetchMovies рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░
рд╕реЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ
.Playing рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдо рдЙрди рдлрд┐рд▓реНрдореЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореВрд╡реА рдерд┐рдПрдЯрд░ рдХреА рд╕реНрдХреНрд░реАрди рдкрд░ рд╣реИрдВред
MovieAPI.fetchMovies (рд╕реЗ: .nowPlaying) рд╡рд┐рдзрд┐ рдлреНрдпреВрдЪрд░ "рдкреНрд░рдХрд╛рд╢рдХ" рдХреЛ рд▓реМрдЯрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо
рд╕рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм" рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рджреЛ рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддреЗ рд╣реИрдВред
ReceCompletion рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ,
рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ
рддреНрд░реБрдЯрд┐ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд▓рд┐рдП рдЖрдкрд╛рддрдХрд╛рд▓реАрди рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
ReceValue рдХреНрд▓реЛрдЬрд░ рдореЗрдВ
, рд╣рдо
рдЬреЗрдирд░реЗрдЯрдирд╢реЙрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ
рд╣реИрдВ рдФрд░ рдЪрдпрдирд┐рдд
рдлрд┐рд▓реНрдореЛрдВ рдХреЛ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
GenerSnapshot рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реА
рдлрд┐рд▓реНрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛
NSDiffableDataSourceSnapshot рдмрдирд╛рддрд╛ рд╣реИ , рдФрд░ рдкрд░рд┐рдгрд╛рдореА
рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ
diffableDataSource рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ
UIKit рдХрдВрдмрд╛рдЗрди рдврд╛рдВрдЪреЗ рд╕реЗ "рдкреНрд░рдХрд╛рд╢рдХреЛрдВ" рдФрд░ "рдЧреНрд░рд╛рд╣рдХреЛрдВ" рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдлрд┐рд▓реНрдореЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдЧреНрд░рд╣реЛрдВ рдореЗрдВ рдзреБрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ - рдЕрдм рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЛрдХрдкреНрд░рд┐рдп, рдЙрдЪреНрдЪ-рд░реЗрдЯреЗрдб рдпрд╛ рдЬреЛ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдлрд┐рд▓реНрдореЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рд╣реИрдВ (
.upcoming )ред рдмреЗрд╢рдХ, рдЖрдк
рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЧрдгрдирд╛ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА
UI
рддрддреНрд╡ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
Stepper
рдпрд╛
Segmented Control
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рдпрд╣ рд╕рд░реНрд╡рд╡рд┐рджрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ
UIKit- рдЖрдзрд╛рд░рд┐рдд
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдирдИ рдШреЛрд╖рдгрд╛рддреНрдордХ
SwiftUI рдврд╛рдВрдЪреЗ рдкрд░ рдЫреЛрдбрд╝ рджреЗрдВред
рдПрдХ
UIKit- рдЖрдзрд╛рд░рд┐рдд
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдб
Gineub рдкрд░
CombineFetchAPICompleted-UIKit
рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдлрд┐рд▓реНрдореЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SwiftUI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
ред
CombineFetchAPI-MY
SwiftUI File
->
New
->
Project
Single View App
iOS
:

UI
тАФ
SwiftUI :

Movie.swift
Model
,
TMDb MovieStore.swift
,
MovieStoreAPIError.swift
MovieService.swift
,
MovieService
Protocol
:
SwiftUI ,
Codable ,
JSON
,
Identifiable ,
[Movie] List .
SwiftUI Equatable Hashable ,
UIKit API
UITableViewDiffableDataSource UIKit . <
struct Movie ,
Equatable Hashable :
........................... .
Identifiable ,
Swift
Identifiable ,
Hashable Equatable .
,
SwiftUI , ,
endpoint , :

,
UIKit ,
movieAPI.fetchMovies (from endpoint: Endpoint) ,
endpoint ┬л┬╗
Future<[Movie, MovieStoreAPIError]> .
Endpoint , ,
case Endpoint index :

,
movies ,
indexEndpoint Endpoint .
View Model
,
MoviesViewModel ,
ObservableObject .
MoviesViewModel.swift View Model
:
@Published :
@Published var indexEndpoint: Int тАФ ,
@Published var movies: [Movie] - .
@Published indexEndpoint ,
indexEndpoint ,
$indexEndpoint .
MoviesViewModel ┬л┬╗
$indexEndpoint ┬л┬╗
AnyPublisher<[Movie], Never> ,
movieAPI.fetchMovies (from: Endpoint (index: indexPoint)) flatMap .

┬л┬╗ ┬л┬╗ ┬л┬╗
assing (to: \.movies, on: self) ┬л┬╗
movies . ┬л┬╗
assing (to: \.movies, on: self) , ┬л┬╗ ,
Never . ?
replaceError(with: [ ]) ,
movies .
SwiftUI .
,
View Model
,
UI
.
ContentView.swift View Model
@EnvironmentObject var moviesViewModel Text(┬лHello, World!┬╗)Text("\(moviesViewModel.indexEndpoint)") ,
indexEndpoint .

View Model
indexEndpoint = 2 , , (
Upcoming ):

UI
, .
Stepper :

тАж
Picker :

┬л┬╗
$moviesViewModel.indexEndpoint View Model
, ( ) :
List ForEach movie :
moviesViewModel.movies View Model
:

┬л┬╗
$moviesViewModel.movies $ , .
moviesViewModel.movies .
, ,
URL
Movie :
Thomas Ricouard MovieSwiftUI .
movies ,
UIImage ImageService ,
Combine fetchImage , ┬л┬╗
AnyPublisher<UIImage?, Never> :

тАж
final class ImageLoader: ObservableObject ,
ObservableObject @Published image: UIImage? :

,
ObservableObject -
objectWillChange .
SwiftUI , - , ,
Views , .
objectWillChange ,
@Published . -
objectWillChange . .
ImageLoader @Published var image:UIImage? ред ,
ImageLoader , ┬л┬╗
$image ┬л┬╗
loadImage() ,
poster size @Published var image:UIImage? ред
objectWillChange .
, ,
imageLoader ImageLoader :
View MoviePosterImage :

тАж
ContentView :

SwiftUI Github CombineFetchAPI-NOError
.
.
,
TMDb .
movieAPI.fetchMovies (from endpoint: Endpoint) , , ┬л┬╗
Future<[Movie, MovieStoreAPIError]> .
, ,
View Model
@Published moviesError: MovieStoreAPIError? , .
Optional ,
nil , :

,
moviesError ,
MoviesViewModel ┬л┬╗
sink :
moviesError UI
,
nil тАж
AlertView :

,
API
:
SwiftUI Github CombineFetchAPI-Error .
,
Future<[Movie],MovieStoreAPIError> ,
AnyPublisher<[Movie], Never> fetchMoviesLight :

(
Never ) ┬л┬╗
assign(to: \.movies, on: self) :

:

рдирд┐рд╖реНрдХрд░реНрд╖
Combine values . ,
Combine , тАФ .
Combine upstream ┬л┬╗
Publishers , ┬л┬╗
Subscribers .
Combine ,
Foundation ,
Foundation .
SwiftUI Combine <
@ObservableObject ,
@Binding @EnvironmentObject .
iOS
Apple
.
:
Fetching Remote Async API with Apple Combine Frameworktry! Swift NYC 2019 тАФ Getting Started with Combine┬лThe ultimate Combine framework tutorial in Swift┬╗.Combine: Asynchronous Programming with SwiftIntroducing Combine тАФ WWDC 2019 тАФ Videos тАФ Apple Developer. session 722( 722 ┬л Combine┬╗ )Combine in Practice тАФ WWDC 2019 тАФ Videos тАФ Apple Developer. session 721( 721 ┬л Combine┬╗ )SwiftUI & Combine: . SwiftUI Combine .MovieSwiftUI .
Visualize Combine Magic with SwiftUI Part 1 ()Visualize Combine Magic with SwiftUI тАУ Part 2 (Operators, subscribing, and canceling in Combine)Visualize Combine Magic with SwiftUI Part 3 (See Combine Merge and Append in Action)
Visualize Combine Magic with SwiftUI тАФ Part 4Visualize Combine Magic with SwiftUI тАФ Part 5Getting Started With the Combine Framework in SwiftTransforming Operators in Swift Combine Framework: Map vs FlatMap vs SwitchToLatestCombine's FutureUsing CombineURLSession and the Combine framework