Apple рдХрдореНрдмрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреВрд░рд╕реНрде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ



рдХрдВрдмрд╛рдЗрди рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ 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 Framework
try! Swift NYC 2019 тАФ Getting Started with Combine
┬лThe ultimate Combine framework tutorial in Swift┬╗.

Combine: Asynchronous Programming with Swift

Introducing 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 4

Visualize Combine Magic with SwiftUI тАФ Part 5

Getting Started With the Combine Framework in Swift
Transforming Operators in Swift Combine Framework: Map vs FlatMap vs SwitchToLatest
Combine's Future
Using Combine
URLSession and the Combine framework

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


All Articles