рдПрдХрд╛рдзрд┐рдХ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВред рд░рдЪрдирд╛, Reducer, FP

рд╣рд╛рдп, рд╣реИрдмреНрд░ред рдореЗрд░рд╛ рдирд╛рдо рдореИрдХреНрд╕рд┐рдо рд╣реИ, рдореИрдВ FINCH рдореЗрдВ рдПрдХ iOS рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВред рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреБрдЫ рдкреНрд░рдерд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдЕрдкрдиреЗ рд╡рд┐рднрд╛рдЧ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИред

рдореИрдВ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рд╣рд░ рдЬрдЧрд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЖрдЧреНрд░рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ - рдпрд╣ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд░рд╛рдордмрд╛рдг рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдПрдлрдкреА рдЧреИрд░-рдорд╛рдирдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓рдЪреАрд▓рд╛ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдПрдлрдкреА рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдореВрд▓ рдмрд╛рддреЗрдВ рдирд╣реАрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдореИрдк, рдХрдо, рдХреЙрдореНрдкреИрдХреНрдЯрдореИрдк, рдкрд╣рд▓реЗ (рдЬрд╣рд╛рдВ :) рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдЦ рдХрдИ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдФрд░ reducer рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧрд╛ред

рдПрдХрд╛рдзрд┐рдХ рдХреНрд╡реЗрд░реА рд╕рдорд╕реНрдпрд╛


рдореИрдВ рдЙрддреНрдкрд╛рджрди рдЖрдЙрдЯрд╕реЛрд░реНрд╕рд┐рдВрдЧ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдРрд╕реЗ рд╣рд╛рд▓рд╛рдд рд╣реИрдВ рдЬрдм рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдЕрдкрдиреЗ рдЙрдкрдареЗрдХреЗрджрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдмреИрдХрдПрдВрдб рдмрдирд╛рдиреЗ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрддрд╛ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмреИрдХрдПрдВрдб рд╕реЗ рджреВрд░ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдХрдИ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╢реНрди рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред

рдХрднреА-рдХрднреА рдореИрдВ рдХреБрдЫ рд▓рд┐рдЦ рд╕рдХрддрд╛ рдерд╛:

networkClient.sendRequest(request1) { result in switch result { case .success(let response1): // ... self.networkClient.sendRequest(request2) { result in // ... switch result { case .success(let response2): // ...  -     response self.networkClient.sendRequest(request3) { result in switch result { case .success(let response3): // ...  -     completion(Result.success(response3)) case .failure(let error): completion(Result.failure(.description(error))) } } case .failure(let error): completionHandler(Result.failure(.description(error))) } } case .failure(let error): completionHandler(Result.failure(.description(error))) } } 

рдШреГрдгрд┐рдд, рд╕рд╣реА? рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

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

 func obtainUserStatus(completion: @escaping (Result<AuthResponse>) -> Void) { let endpoint= AuthEndpoint.loginRoute networkService.request(endpoint: endpoint, cachingEnabled: false) { [weak self] (result: Result<LoginRouteResponse>) in switch result { case .success(let response): self?.obtainLoginResponse(response: response, completion: completion) case .failure(let error): completion(.failure(error)) } } } private func obtainLoginResponse(_ response: LoginRouteResponse, completion: @escaping (Result<AuthResponse>) -> Void) { let endpoint= AuthEndpoint.login networkService.request(endpoint: endpoint, cachingEnabled: false) { [weak self] (result: Result<LoginResponse>) in switch result { case .success(let response): self?.obtainAuthResponse(response: response, completion: completion) case .failure(let error): completion(.failure(error)) } } private func obtainAuthResponse(_ response: LoginResponse, completion: @escaping (Result<AuthResponse>) -> Void) { let endpoint= AuthEndpoint.auth networkService.request(endpoint: endpoint, cachingEnabled: false) { (result: Result<AuthResponse>) in completion(result) } } 

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдЬреА рддрд░реАрдХреЛрдВ рдореЗрдВ рдореБрдЭреЗ рдкреНрд░реЙрдХреНрд╕реА рдХрд░рдирд╛ рд╣реИ

 completion: @escaping (Result<AuthResponse>) -> Void 

рдФрд░ рдореБрдЭреЗ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред

рдлрд┐рд░ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ - "рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдпрд╛?" рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрд╡рд┐рдлреНрдЯ, рдЕрдкрдиреЗ рдЬрд╛рджреВ рдФрд░ рд╕рд┐рдВрдереИрдЯрд┐рдХ рдЪреАрдиреА рдХреЗ рд╕рд╛рде, рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рд╕реБрдкрд╛рдЪреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрддреНрд╡реЛрдВ рдореЗрдВ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред

рд░рдЪрдирд╛ рдФрд░ Reducer


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

рдЧрдгрд┐рддреАрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд░рдЪрдирд╛ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 func compose<A,B,C>(_ f: @escaping (A) -> B, and g: @escaping (B) -> C) -> (A) -> C { return { a in g(f(a)) } } 

рдРрд╕реЗ рдХрд╛рд░реНрдп рдЪ рдФрд░ рдЫ рд╣реИрдВ рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрди рдЗрдирдкреБрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдореА рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рджреЛ рдХреЛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдЗрдирдкреБрдЯ рд╕рдВрдЦреНрдпрд╛ 1 рд╕реЗ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдЦреБрдж рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддрд╛ рд╣реИред

 let increment: (Int) -> Int = { value in return value + 1 } let multiply: (Int) -> Int = { value in return value * value } 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдЗрди рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

 let result = compose(multiply, and: increment) result(10) //     101 


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╕рд╣рдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ
(рдпрджрд┐ рд╣рдо рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ 121 рдирдВрдмрд░ рдорд┐рд▓рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреНрд╖рдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред

 let result = compose(increment, and: multiply) result(10) //     121 

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

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:

 let value: Int? = array .lazy .filter { $0 % 2 == 1 } .first(where: { $0 > 10 }) 

рдпрд╣ рд░рдЪрдирд╛ рд╣реИред рд╣рдо рдЗрдирдкреБрдЯ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЬреЛрдбрд╝ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдПрдХ рдкреВрд░реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЬреЛрдбрд╝ рд╣реИред

рдФрд░ рдЕрдм рдЪрд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рд╕реЛрдЪрддреЗ рд╣реИрдВ :)


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

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдПрдХ рдРрд╕реА рдЗрдХрд╛рдИ рдмрдирд╛рдПрдБ рдЬреЛ рд╕рд┐рд░реНрдл рдореЗрд░реЗ рд░рд╛рдЬреНрдп рдФрд░ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддреА рд╣реИ?

рддреЛ рд╣рдореЗрдВ Reducer рдорд┐рд▓рддрд╛ рд╣реИ

 struct Reducer<S, A> { let reduce: (S, A) -> S } 

рд╣рдо рдХрдо рд╡рд┐рдзрд┐ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рджреЗрдВрдЧреЗ, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ рд░рд╛рдЬреНрдп рдорд┐рд▓реЗрдЧрд╛, рдЬрд┐рд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╣рдо рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рдирдП рд░рд╛рдЬреНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ, рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред

 struct Reducer<S, A> { let reduce: (S, A) -> S } struct Reducer<S, A> { let reduce: (S) -> (A) -> S } struct Reducer<S, A> { let reduce: (inout S, A) -> Void } 

рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк "рдХреНрд▓рд╛рд╕рд┐рдХ" рд╣реИред

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

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

рд░рд┐рдбреНрдпреВрд╕рд░ рд▓рдЧрд╛рдирд╛


рд╣рдо Reducer рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдореМрдЬреВрджрд╛ рдХреЛрдб рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ RequestState рдмрдирд╛рдПрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВред

 class RequestState { // MARK: - Private properties private let semaphore = DispatchSemaphore(value: 0) private let networkClient: NetworkClient = NetworkClientImp() // MARK: - Public methods func sendRequest<Response: Codable>(_ request: RequestProtocol, completion: ((Result<Response>) -> Void)?) { networkClient.sendRequest(request) { (result: Result<Response>) in completion?(result) self.semaphore.signal() } semaphore.wait() } } 

рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ DispatchSemaphore рдЬреЛрдбрд╝рд╛

рдЖрдЧреЗ рдмрдврд╝реЛред рдЕрдм рд╣рдореЗрдВ рддреАрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ RequestAction рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 enum RequestAction { case sendFirstRequest(FirstRequest) case sendSecondRequest(SecondRequest) case sendThirdRequest(ThirdRequest) } 

рдЕрдм рдПрдХ Reducer рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ RequestState рдФрд░ RequestAction рд╣реЛред рд╣рдо рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ - рд╣рдо рдкрд╣рд▓реЗ, рджреВрд╕рд░реЗ, рддреАрд╕рд░реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

 let requestReducer = Reducer<RequestState, RequestAction> { state, action in switch action { case .sendFirstRequest(let request): state.sendRequest(request) { (result: Result<FirstResponse>) in // 1 Response } case .sendSecondRequest(let request): state.sendRequest(request) { (result: Result<SecondResponse>) in // 2 Response } case .sendThirdRequest(let request): state.sendRequest(request) { (result: Result<ThirdResponse>) in // 3 Response } } } 

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╢реИрд▓реА рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ, рджреВрд╕рд░реЗ рдФрд░ рддреАрд╕рд░реЗ рдЕрдиреБрд░реЛрдз рдЖ рд░рд╣реЗ рд╣реИрдВред рд╕рдм рдХреБрдЫ рдкрдардиреАрдп рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред

 var state = RequestState() requestReducer.reduce(&state, .sendFirstRequest(FirstRequest())) requestReducer.reduce(&state, .sendSecondRequest(SecondRequest())) requestReducer.reduce(&state, .sendThirdRequest(ThirdRequest())) 

рдирд┐рд╖реНрдХрд░реНрд╖


рдирдИ рдЪреАрдЬреЗрдВ рд╕реАрдЦрдиреЗ рд╕реЗ рдбрд░реЛ рдордд рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реАрдЦрдиреЗ рд╕реЗ рдбрд░реЛ рдорддред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдЕрднреНрдпрд╛рд╕ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдкрд░ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рддрд┐рдорд╛рдиреЛрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╕рдВрдпреЛрдЬрди рдФрд░ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред

рдпрджрд┐ рдХреЛрдИ рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдХреЛрдг рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

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


All Articles