Reactivecocoa: рдЖрдк рдЙрди рдЖрджреЗрд╢реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдкреБрд╖реНрдЯрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдорд╛рд░реНрдЪ 2014  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: ReactiveCocoa/ReactiveCocoa

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЕрдкрдирд╛ рд╕рд┐рд░ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддрд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ UIButton рд╣реИ рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рддрд╛ рд╣реИ - рдПрдХ рд╡рд┐рд▓реЛрдкрдиред рдореЗрд░реЗ рд╡реНрдпреВ рдореЙрдбрд▓ рдореЗрдВ deleteCommand рдкреНрд░реЙрдкрд░реНрдЯреА рд╣реИ рдЬреЛ рдПрдХ рдХрдорд╛рдВрдб рд▓реМрдЯрд╛рддреА рд╣реИ рдЬреЛ рдХрдорд╛рдВрдб рдХреЛ рдмрдЯрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рд╡рд╛рдпрд░рд┐рдВрдЧ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрдм рдмрдЯрди рдЯреИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдкреБрд╖реНрдЯрд┐рдХрд░рдг UIAlertView рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдареАрдХ рд╣рд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд┐рд▓реЛрдкрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдпрджрд┐ рд╡реЗ рд░рджреНрдж рдХрд░реЗрдВ рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

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

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

рддреЛ рдХреНрдпрд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛, рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрд░реАрдХрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рдПрдХрд▓ RACCommand рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдкреБрд╖реНрдЯрд┐ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рд╡рд┐рд▓реЛрдкрди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ UIButton рдЬреБрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ?

рд╕рднреА 9 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЕрдкрдиреЗ рджреГрд╢реНрдп рдореЙрдбрд▓ рд╕реЗ alerts рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ AlertViewModel s рдХреЛ рдмреЗрдирдХрд╛рдм рдХрд░реЗрдВред рдкреНрд░рддреНрдпреЗрдХ рдмрдЯрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХрдорд╛рдВрдб рд╕реЗрдЯ рдХрд░реЗрдВред рдпрд╣ рд╡рд╣ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЕрдкрдиреЗ рдРрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

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

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

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдмрд╕ рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЬрд╛рдКрдВрдЧрд╛: рдмрдЯрди рдХреЗ enabled рдХреЛ рдХрдорд╛рдВрдб рд╕реЗ рдмрд╛рдВрдзреЗрдВ, рд▓реЗрдХрд┐рди рдХрдорд╛рдВрдб рдХреЛ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ, рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрдорд╛рдВрдб рдХреЗ -execute: рдХреЛ UIAlertView рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред

рд╣рд╛рдБ рдореВрд▓ рд░реВрдк рд╕реЗ рдбреЗрдирд┐рд╕ рдиреЗ рдХреНрдпрд╛ рдХрд╣рд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрдИ рдмрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред
рдЖрдкрдХреЗ рд╡реНрдпреВ рдореЙрдбрд▓ рдкрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ:

  1. рдЖрдкрдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджреЗрд╢ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдЯрд╛рдирд╛)ред
  2. рдПрдХ рд╕рдВрдХреЗрдд рдЬреЛ рдПрдХ рдкреБрд╖реНрдЯрд┐рдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдореВрд▓реНрдп рднреЗрдЬрддрд╛ рд╣реИ
  3. рдкреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХрд▓ рдЖрджреЗрд╢, рдпрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджреЗрд╢

рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ (рдЕрдирдкрд░реАрдХреНрд╖рд┐рдд, рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдордЬрдмреВрдд/рдХрдордЬреЛрд░ рдХрд░рдиреЗ рдХреЗ рдмрд┐рдирд╛):

self.deleteCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id objectToDelete) { 
    [return self.confirmationCommand.executionSignals
        switchToLatest]
            flattenMap:^id(NSNumber *confirmed) {
                if(confirmed) {
                    return [self deleteObject:objectToDelete];
                } else {
                    return [RACSignal error:someErrorWithAMessageMaybe];
                }
            }];
}];

self.confirmationRequiredSignal = [self.deleteCommand.executing
    filter: ^BOOL(NSNumber *executing) {
        return executing.boolValue;
    }];

рддреЛ рдЖрдкрдХреЗ рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдЖрдкрдХрд╛ рдбрд┐рд▓реАрдЯ рдмрдЯрди рд╡реНрдпреВ рдореЙрдбрд▓ рдкрд░ deleteCommand рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рддреБрд░рдВрдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рдбрд┐рд▓реАрдЯ рдХрдорд╛рдВрдб рдЕрдм рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП confirmationCommand.executionSignals рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдбрд┐рд▓реАрдЯ рдХрдорд╛рдВрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди self.confirmationRequiredSignal рдкрд░ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рди рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред

рдлрд┐рд░ рдЖрдкрдХрд╛ рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпреВрдореЛрдбреЗрд▓ рдкрд░ confirmationRequiredSignal , рдПрдХ рдЕрд▓рд░реНрдЯ рд╡реНрдпреВ рдлреЗрдВрдХрддрд╛ рд╣реИ рдФрд░ рдЕрд▓рд░реНрдЯ рд╡реНрдпреВ рдкрд░ рдмрдЯрди рдХреЛ рдкреБрд╖реНрдЯрд┐рдХрд░рдг рдХрдорд╛рдВрдб рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдкреБрд╖реНрдЯрд┐рдХрд░рдг рдХрдорд╛рдВрдб рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдЯрди рдХреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдорд┐рд▓ рдЬрд╛рдПрдЧреА, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ, рддреЛ рдЖрдк рдХрд░реЗрдВрдЧреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ confirmed рдорд╛рди рдореЗрдВ рдореИрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред рдПрдХ рдмрд╛рд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдмрдЯрди рдЯреИрдк рдХрд░рддрд╛ рд╣реИ, рддреЛ self.confirmationCommand рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ confirmed рдорд╛рди рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЪрдХреНрд░ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЖрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ deleteCommand рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рд╢рд╛рдпрдж self.deleteCommand.errors рджреЗрдЦрдХрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдпрд╛ рдХреБрдЫ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╛ рдЖрдк рдХрдорд╛рдВрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдЦрд╛рд▓реА рд╕рд┐рдЧреНрдирд▓ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдореЙрдбрд▓ рдЕрд▓рд░реНрдЯ рд╡реНрдпреВ, рдПрдХреНрд╢рди рд╢реАрдЯ рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред RACCommands рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред

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

@sprynmr рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдПрдХ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди IMO рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЧрдпрд╛ рдерд╛ред

рдореИрдВрдиреЗ рд╕рдВрдкрддреНрддрд┐ рдХреЛ deleteWithConfirmation: рдирд╛рдордХ рдПрдХ рд╡рд┐рдзрд┐ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬреЛ рдПрдХ рдПрдХрд▓ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ - рдПрдХ рдмреНрд▓реЙрдХ рдЬреЛ рдПрдХ RACSignal рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдПрдХрд▓ рдорд╛рди рднреЗрдЬрдХрд░ рдкреБрд╖реНрдЯрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, @YES , рдпрд╛ @NO

рдХрдорд╛рдВрдб рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рд╣реИ рдЬреЛ рдкреБрд╖реНрдЯрд┐рдХрд░рдг рд╕рд┐рдЧреНрдирд▓ рд╕реЗ рдкрд╣рд▓рд╛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╕рд┐рдЧреНрдирд▓ рдкрд░ рдореИрдк рдХрд░рддрд╛ рд╣реИ - рдбрд┐рд▓реАрдЯ рд╕рд┐рдЧреНрдирд▓ рдХреА рдкреБрд╖реНрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдЦрд╛рд▓реА рд╕рд┐рдЧреНрдирд▓:

- (RACCommand *)deleteWithConfirmation:(RACSignal*(^)(void))signalBlock
{
    NSParameterAssert(signalBlock);

    @weakify(self);

    return [[RACCommand alloc] initWithEnabled:nil signalBlock:^RACSignal *(id input) {
        @strongify(self);

        RACSignal *confirmationSignal = signalBlock();

        return [[confirmationSignal take:1] flattenMap:^RACStream *(id value) {
            if ([value boolValue]) {
                return [self doDeletion]; // for example
            }
            else {
                return [RACSignal empty];
            }
        }];
    }];
}

рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рдмрдЯрди рдкрд░ рдХрдорд╛рдВрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рд╡рд╛рдпрд░ рдХрд░рддрд╛ рд╣реВрдВ:

self.deleteButton.rac_command = [self.viewModel deleteWithConfirmation:^RACSignal *{
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Delete Widget" message:@"Are you sure you want to delete this widget?" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:@"Delete", nil];

        [alert show];

        return [alert.rac_buttonClickedSignal map:^id(NSNumber *buttonIndex) {
            return @([buttonIndex integerValue] == 1);
        }];
    }];

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

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

- (RACCommand *)deleteWithoutConfirmationCommand
{
    return [self deleteWithConfirmation:^RACSignal *{
        return [RACSignal return:@YES];
    }]
}

рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рднреА рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдлрд╛рдЗрд▓ рдХрд░ рджреВрдВрдЧрд╛ред

@sprynmr рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╣реИрд░рд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИред
рдмреНрд▓реЙрдХ рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╕рд┐рдЧреНрдирд▓ рдХрднреА рднреА рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ ( self.confirmationCommand.executionSignals.switchToLatest )ред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХрдорд╛рдВрдб рд╣рдореЗрд╢рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдореЛрдб рдореЗрдВ рд░рд╣реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ?

self.deleteCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id objectToDelete) { 
    [return self.confirmationCommand.executionSignals
        switchToLatest]
            flattenMap:^id(NSNumber *confirmed) {
                if(confirmed) {
                    return [self deleteObject:objectToDelete];
                } else {
                    return [RACSignal error:someErrorWithAMessageMaybe];
                }
            }];
}];

@haifengkao рдЬреАрд╡рдирдЪрдХреНрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬреЛрдбрд╝реЗрдВ, рдЬреИрд╕реЗ take:1 рдмрд╛рдж switchToLatest

рд╡рд╣рд╛рдВ рдПрдХ рд░рд┐рдЯреЗрди рд╕рд╛рдЗрдХрд┐рд▓ рдХреЗ рд▓рд┐рдП рднреА рджреЗрдЦреЗрдВред self рд▓рд┐рдП рдЕрдкрдиреЗ рдПрдХрд╛рдзрд┐рдХ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ @ рдордЬрдмреВрдд/рдХрдордЬреЛрд░ рдХрд░реЗрдВ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

iby picture iby  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

akashivskyy picture akashivskyy  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

danishin picture danishin  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

LunaCodeGirl picture LunaCodeGirl  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

v-silin picture v-silin  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ