рд╣рдо iOS рдкрд░ Sberbank Online рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ



рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдкрд░реАрдХреНрд╖рдг рдкрд┐рд░рд╛рдорд┐рдб рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд╛рднреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдПред рд▓реЗрдХрд┐рди рд╕рд┐рджреНрдзрд╛рдВрдд рдЖрдорддреМрд░ рдкрд░ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИред рдЖрдЬ рд╣рдо рд▓рд╛рдЦреЛрдВ iOS рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдореЗрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдЙрд╕ рдХрдард┐рди рд░рд╛рд╕реНрддреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЬреЛ рд╣рдорд╛рд░реА рдЯреАрдо рдХреЛ рд╕реНрдерд┐рд░ рдХреЛрдб рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдерд╛ред

рд╕реНрдерд┐рддрд┐ рдпрд╣ рд╣реИ: рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЦреБрдж рдХреЛ рдФрд░ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдЖрдзрд╛рд░ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред рд╕рдордп рдХреЗ рд╕рд╛рде, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рджрд░реНрдЬрди рд╕реЗ рдЕрдзрд┐рдХ рд╣рдЬрд╛рд░ рдпреВрдирд┐рдЯ - рдФрд░ рдПрдХ рд╣рдЬрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдпреВрдЖрдИ-рдкрд░реАрдХреНрд╖рдг рдмрди рдЧрдИ рд╣реИред рдЗрддрдиреЗ рдмрдбрд╝реЗ рдкрд░реАрдХреНрд╖рдг рдЖрдзрд╛рд░ рдиреЗ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЬрдиреНрдо рджрд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣рдо рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо рд╕реНрд╡рдЪреНрдЫ (рдЧреИрд░-рдПрдХреАрдХрд░рдг) рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЖрдиреЗ рд╡рд╛рд▓реА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВрдЧреЗ, рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо рдпреВрдЖрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рдЯреЗрд╕реНрдЯ рд░рди рдХреА рд╕реНрдерд┐рд░рддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреИрд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреИрдЯ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЪрд╛рд╣реЗ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЕрдиреБрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рд╣реЛред рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рдЧрд┐рд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рд╕рд░реНрд╡рд░ (CI) рдмрд╛рдзрд╛ рд╕реЗ рдирд╣реАрдВ рдЧреБрдЬрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


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

рдЗрд╕ рд╡рд░реНрд╖ Apple рдХреЗ WWDC рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдп рд╕рдореНрдореЗрд▓рди рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛:

  • рдпрд╣ рд╕рддреНрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдкрд░реАрдХреНрд╖рдг, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд▓рдХреНрд╖реНрдп рдХреЛрдб рдХреЗ рдХрд╡рд░реЗрдЬ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдмрд╛рдд рдХрд░рддрд╛ рд╣реИред
  • рдпрд╣рд╛рдВ Apple рдиреЗ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдЬрд╛рдВрдЪ, рд╣реИрдХрд┐рдВрдЧ, рдкрд░реАрдХреНрд╖рдг рд╕реВрдЪрдирд╛рдУрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЧрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреАред

рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг


рдирд┐рдорд┐рд╖ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

0. рд╣рдо рдмреБрдирд┐рдпрд╛рджреА рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЧреБрдгрд╡рддреНрддрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреЗ рд╣реИрдВ: рдЕрд▓рдЧрд╛рд╡, рдореЛрдХрд╛ рдХреА рд╢реБрджреНрдзрддрд╛, рдЖрджрд┐ред рд╣рдо рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ: рдмреНрд▓рд┐рдВрдХрд┐рдВрдЧ рдЯреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде, рд╣рдо рдЯреЗрд╕реНрдЯ рдХреЛрдб рдмрджрд▓рддреЗ рд╣реИрдВ, рди рдХрд┐ рдЯреЗрд╕реНрдЯ рдХреЛрдбред

рдпрджрд┐ рдпрд╣ рдЖрдЗрдЯрдо рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВ:

1. рд╣рдо рдЙрди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдФрд░ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рддрд╣рдд рдкрд░реАрдХреНрд╖рдг рдЧрд┐рд░рддрд╛ рд╣реИ;
2. рдкрддрди рдХрд╛ рдХрд╛рд░рдг рдЦреЛрдЬреЗрдВ;
3. рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдмрджрд▓реЗрдВ;
4. рдкрд╣рд▓реЗ рдЪрд░рдг рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЧрд┐рд░рд╛рд╡рдЯ рдХрд╛ рдХрд╛рд░рдг рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдЦреЗрд▓ рдЦреЗрд▓рддреЗ рд╣реИрдВ


рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк iOS рдХреЗ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдПрдХ рд╣реА рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдирд╛ рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╕рдлрд▓ рд╣реИ, рдФрд░ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ: "рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рд╕реАрдЖрдИ рдкрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛"ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рд╕реА рдФрд░ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд╣реИред

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

рдпрджрд┐ рд╕рдВрдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рд╕рдлрд▓ рдерд╛ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЧрд┐рд░рд╛рд╡рдЯ рджрд░реНрдЬ рдирд╣реАрдВ рдХреА рдЧрдИ рдереА, рддреЛ рдЖрдк рд░рди рдХреЛ рдХрдИ рдмрд╛рд░ рджреЛрд╣рд░рд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░, рдЖрдкрдХреЛ xcodebuild рдХреЗ рд╕рд╛рде рдПрдХ рд▓реВрдк рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

#! /bin/sh x=0 while [ $x -le 100 ]; do xcodebuild -configuration Debug -scheme "TargetScheme" -workspace App.wcworkspace -sdk iphonesimulator -destination "platfrom=iOS Simulator, OS=11.3, name=iPhone 7" test >> "report.txt"; x=$(( $x +1 )); done 

рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЧрд┐рд░рд╛рд╡рдЯ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдФрд░ рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ - рджрд░реНрдЬ рдХреА рдЧрдИ рдЧрд┐рд░рд╛рд╡рдЯ рдХреЗ рдХрд╛рд░рдг рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ред

рдЧрд┐рд░рд╛рд╡рдЯ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдг


рдмреНрд▓рд┐рдВрдХрд┐рдВрдЧ рдпреВрдирд┐рдЯ-рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рдХрд╛рдо рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг, рдФрд░ рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рдиред

рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЧрд┐рд░рдиреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рддреАрди рдореБрдЦреНрдп рд╕рдореВрд╣ рд╣реИрдВ:

рдЦрд░рд╛рдм рдЗрдиреНрд╕реБрд▓реЗрд╢рди

рдЕрд▓рдЧрд╛рд╡ рд╕реЗ рд╣рдорд╛рд░рд╛ рддрд╛рддреНрдкрд░реНрдп рдПрдиреНрдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рд╕реЗ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рд╣реИ: рдПрдХ рднрд╛рд╖рд╛ рддрдВрддреНрд░ рдЬреЛ рдХреБрдЫ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдШрдЯрдХреЛрдВ рдХреЛ рджреВрд╕рд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рдЕрд▓рдЧрд╛рд╡ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рднреА рдкрд░реАрдХреНрд╖рдг рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░, рдХрд┐рдЪреЗрди, рдиреЗрдЯрд╡рд░реНрдХ, рдХреЛрд░рдбрд╛рдЯрд╛, рд╕рд┐рдВрдЧрд▓рдЯрди, NSUserDefaults, рдЬреИрд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╣реИ рдХрд┐ рдЧрд░реАрдм рдЕрд▓рдЧрд╛рд╡ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдерд╛рдиреЛрдВ рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП, рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рддреЗ рд╕рдордп, рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рджреВрд╕рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд░реАрдХреНрд╖рдг "рдкрд▓рдХ" рд╕реЗ рд╢реБрд░реВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдХреНрдпреЛрдВрдХрд┐, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рджреЛ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВ - рдЬрдм рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЬрдм рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдХреНрд╕рд░, рд╡рд░реНрдгрд┐рдд рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдирд┐рд╣рд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЧрд▓рддреА рд╕реЗ рдРрд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╕реЗрдЯ / рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВред

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

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХрд░реЗрдВ

рд╕рднреА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрд░реАрдХреНрд╖рдг рдХреА рдХрдард┐рдирд╛рдИ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкрджреНрдзрддрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджрд╛рдпрд░реЗ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ "рдЬрдорд╛ рджреЗрддрд╛ рд╣реИ"ред рдкрд░рд┐рдгрд╛рдо рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рдЧрд┐рд░рд╛рд╡рдЯ рд╣реЛрдЧреАред

 //act [self.testService loadImageFromUrl:@"www.google.ru" handler:^(UIImage * _Nullable image, NSError * _Nullable error) { //assert OCMVerify([cacheMock imageAtPath:OCMOCK_ANY]); OCMVerify([cacheMock dateOfFileAtPath:OCMOCK_ANY]); OCMVerify([imageMock new]); [imageMock stopMocking]; }]; [self waitInterval:0.2]; 

рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ:

  1. NSRunLoop рдЪрд▓рд╛рдПрдВ
  2. waitForExpectationsWithTimeout

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

рд╣рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╣рдо рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдЖрдЧреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реЗрд╡рд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕реНрдерд┐рд░ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдХ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

 @interface Service : NSObject @property (nonatomic, strong) id<APIClient> apiClient; @end @protocol APIClient <NSObject> - (void)getDataWithCompletion:(void (^)(id responseJSONData))completion; @end - (void)testRequestAsync { // arrange __auto_type service = [Service new]; service.apiClient = [APIClient new]; XCTestExpectation *expectation = [self expectationWithDescription:@"Request"]; // act id receivedData = nil; [self.service receiveDataWithCompletion:^(id responseJSONData) { receivedData = responseJSONData; [expectation fulfill]; }]; [self waitForExpectationsWithTimeout:10 handler:^(NSError * _Nullable error) { expect(receivedData).notTo.beNil(); expect(error).to.beNil(); }]; } 

рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рдХрд╛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рд╣реЛрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рджрд┐рд▓рд╛рдПрдЧрд╛ред

рдЙрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирдХрд▓реА APIClient рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

 @interface APIClientMock : NSObject <APIClient> @end @implementation - (void)getDataWithCompletion:(void (^)(id responseJSONData))completion { __auto_type fakeData = @{ @"key" : @"value" }; if (completion != nil) { completion(fakeData); } } @end 

рддрдм рдкрд░реАрдХреНрд╖рдг рд╕рд░рд▓ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛

 - (void)testRequestSync { // arrange __auto_type service = [Service new]; service.apiClient = [APIClientMock new]; // act id receivedData = nil; [self.service receiveDataWithCompletion:^(id responseJSONData) { receivedData = responseJSONData; }]; expect(receivedData).notTo.beNil(); expect(error).to.beNil(); } 

рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЗрдХрд╛рдИ рдХреЛ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рдХреЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╢реЗрд╖ рддрд░реНрдХ рдХреЛ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдП рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреБрдХрд╕рд╛рдиреЛрдВ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред

рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдб рд╕реЗ UI рдкрд░рдд рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдореБрдЦреНрдп рдереНрд░реЗрдб рдореЗрдВ рд╣реИрдВ рдФрд░ рдпрджрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛:

 func performUIUpdate(using closure: @escaping () -> Void) { // If we are already on the main thread, execute the closure directly if Thread.isMainThread { closure() } else { DispatchQueue.main.async(execute: closure) } } 

рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдбреАред рд╕реИрдВрдбрд▓ рдХрд╛ рд▓реЗрдЦ рджреЗрдЦреЗрдВред

рдЖрдкрдХреЗ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдкрд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб
рдЕрдХреНрд╕рд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рддреЛрдВ рдХреЛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ:

  • рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрд╡реЗрджрди рдХреЗ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ,
  • рдПрд╕рдбреАрдХреЗ рдореЗрдВ рдирд┐рдЬреА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрдХреНрд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ,
  • рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрд╕рдбреАрдХреЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ


рдЙрдкрд░реЛрдХреНрдд рдорд╛рдорд▓реЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд iOS рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рднреАред рдЕрд▓рдЧ-рдЕрд▓рдЧ, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдкрд╕реЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИред

рдЗрд╕рдХреЗ рд╕рд╛рде, рд╣рдо рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд Sberbank Online iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдкрд░ рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ 1500 рдпреВрдЖрдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп рд╣реБрдИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЙрди рдкрд░ рдХрд╛рдмреВ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрдВрдЬрдиреЛрдВред

рдпрд╣ рд▓реЗрдЦ рд░реЗрдЧреЛ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ - рдПрдВрдЯреЛрди рд╡реНрд▓рд╛рд╕реЛрд╡, рд╡рд┐рдХрд╛рд╕ рдХреЗ рдкреНрд░рдореБрдЦ рдФрд░ рдЖрдИрдУрдПрд╕ рдбреЗрд╡рд▓рдкрд░ред

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


All Articles