Reactivecocoa: Π›ΡƒΡ‡ΡˆΠΈΠΉ шаблон для отмСняСмых ΠΊΠΎΠΌΠ°Π½Π΄

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 14 мая 2014  Β·  4ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: ReactiveCocoa/ReactiveCocoa

Π― искал подходящий шаблон для ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

Π’ΠΎΡ‚ сцСнарий:
ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Joe Ρ…ΠΎΡ‡Π΅Ρ‚ Π²ΠΎΠΉΡ‚ΠΈ Π² слуТбу Twitter Π½Π° своСм устройствС. На экранС Π΅ΡΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠ° с надписью twitter, ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π½Π΅Π΅, запускаСтся процСсс Π²Ρ…ΠΎΠ΄Π° Π² систСму, ΠΈ тСкст Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅ измСняСтся Π½Π° Β«ΠžΡ‚ΠΌΠ΅Π½Π°Β». ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π²Ρ…ΠΎΠ΄Π° Π² систСму ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 30 сСкунд), ΠΈ Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ снова Π½Π°ΠΆΠΌΠ΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ этого Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ…ΠΎΠ΄ Π² систСму Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½.

Π― ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… способов Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ этого, Π½ΠΎ всС ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‡Π΅Π½ΡŒ нСприятный Π·Π°ΠΏΠ°Ρ…. Π’ΠΎΡ‚ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ я ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π» Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚:

<strong i="9">@property</strong> (strong, nonatomic) RACCommand *twitterLoginCommand;
<strong i="10">@property</strong> (strong, nonatomic) RACCommand *cancelCommand;
<strong i="11">@property</strong> (strong, nonatomic) id authenticatedUser;
<strong i="12">@property</strong> (weak, nonatomic) RACDisposable * authenticationDisposable;

-(void) viewDidLoad {
  RAC(self, twitterButton.rac_command, self.twitterLoginCommand) = [[RACObserve(self, twitterLoginCommand.executing) flatten]
  map:^id(NSNumber * value) {
    @strongify(self);
    if (value.boolValue) {
      return self.cancelCommand;
    } else {
      return self.twitterLoginCommand;
    }
  }];
}

-(RACCommand *) cancelCommand {
  if (!_cancelCommand) {
    @weakify(self);
    _cancelCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
      @strongify(self);
      [self.authenticationDisposable dispose];

      return [RACSignal empty];
    }];
  }

  return _cancelCommand;
}

- (RACCommand *)twitterLoginCommand {
  if (!_twitterLoginCommand) {
    @weakify(self);
    _twitterLoginCommand = [[RACCommand alloc]initWithSignalBlock: ^RACSignal *(UIButton *button) {
      @strongify(self);

      RACSignal * signal = [self twitterSignInSignal];
      self.authenticationDisposable = [signal subscribeNext:^(FAUser * user) {
        self.authenticatedUser = user;
      }error:^(NSError *error) {
        self.authenticationDisposable = nil;
      }];
      return signal;
    }];
  }

  return _twitterLoginCommand;
}

- (RACSignal *)twitterSignInSignal {
//Left out, returns a signal with a user
}

ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Ρƒ мСня Π±Ρ‹Π»Π° подписка Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ twitter Π² viewDidLoad ΠΈ использованиС takeUntil для сигнала ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ (вмСсто использования ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта ΠΈ подписки с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ), Π½ΠΎ это, ΠΏΠΎΡ…ΠΎΠΆΠ΅, Π½Π΅ остановило Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ сразу послС ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ (Π·Π°Π΄Π°Ρ‡Π° Π²Ρ…ΠΎΠ΄Π° Π² систСму Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° сигнал Π½Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ takeUntil).

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ это.

_twitterLoginCommand = [[RACCommand alloc] initWithSignalBlock:^(id _) {
      @strongify(self);
      return [[self 
          twitterSignInSignal] 
          takeUntil:self.cancelCommand.executionSignals];
    }];

RAC(self.authenticatedUser) = [self.twitterLoginCommand.executionSignals switchToLatest];

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ Π²Π°ΠΌ пСрСнСсти созданиС ΠΊΠΎΠΌΠ°Π½Π΄ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ВсС 4 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ это.

_twitterLoginCommand = [[RACCommand alloc] initWithSignalBlock:^(id _) {
      @strongify(self);
      return [[self 
          twitterSignInSignal] 
          takeUntil:self.cancelCommand.executionSignals];
    }];

RAC(self.authenticatedUser) = [self.twitterLoginCommand.executionSignals switchToLatest];

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ Π²Π°ΠΌ пСрСнСсти созданиС ΠΊΠΎΠΌΠ°Π½Π΄ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Π­Ρ‚ΠΎ сработало ΠΊΠ°ΠΊ ΡˆΠ°Ρ€ΠΌ, ΠΈ всС это Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠ°Ρ…Π½Π΅Ρ‚. Бпасибо, ΠΌΠ½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»Π°ΡΡŒ ΠΏΠ°Ρ€Π° Π΄Π½Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅ΠΊΠΎ, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ, я Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ упустил, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π² ΠΏΡ€ΠΎΡˆΠ»Ρ‹ΠΉ Ρ€Π°Π·.

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°!

RAC (self.authenticatedUser) = [self.twitterLoginCommand.executionSignals switchToLatest];
Ссли ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π°
RAC (self.authenticatedUser) = [self.twitterLoginCommand.executionSignals сглаТиваСтся];
Π»ΡƒΡ‡ΡˆΠ΅ ? @notxcain

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ

Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ вопросы

mdiep picture mdiep  Β·  5ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

eimantas picture eimantas  Β·  6ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

akashivskyy picture akashivskyy  Β·  5ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

samidalouche picture samidalouche  Β·  6ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

dougmcbride picture dougmcbride  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ