Reactivecocoa: ์ทจ์†Œ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํŒจํ„ด

์— ๋งŒ๋“  2014๋…„ 05์›” 14์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ReactiveCocoa/ReactiveCocoa

์ทจ์†Œ ํ•  ์ˆ˜์žˆ๋Š” ๋ช…๋ น์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ํŒจํ„ด์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
Joe ์‚ฌ์šฉ์ž๋Š” ์žฅ์น˜์—์„œ ํŠธ์œ„ํ„ฐ ์„œ๋น„์Šค์— ๋กœ๊ทธ์ธํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ํ™”๋ฉด์— ํŠธ์œ„ํ„ฐ๋ผ๋Š” ๋ฒ„ํŠผ์ด ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ํƒญํ•˜๋ฉด ๋กœ๊ทธ์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ๋ฒ„ํŠผ์˜ ํ…์ŠคํŠธ๊ฐ€ ์ทจ์†Œ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ํ”„๋กœ์„ธ์Šค์— ์˜ค๋žœ ์‹œ๊ฐ„ (์˜ˆ : 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
}

์›๋ž˜๋Š” viewDidLoad์—์„œ twitter ๋ช…๋ น์„ ๊ตฌ๋…ํ•˜๊ณ  ์ทจ์†Œ ์‹ ํ˜ธ์— takeUntil์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ (์ฒ˜๋ถ„ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ช…๋ น์œผ๋กœ ๊ตฌ๋…ํ•˜๋Š” ๋Œ€์‹ ) ๋ช…๋ น์ด ์ทจ์†Œ ์ฆ‰์‹œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ์ค‘์ง€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (๋กœ๊ทธ์ธ ์ž‘์—… ์‹ ํ˜ธ๊ฐ€ takeUntil์„ ์ฒ˜๋ฆฌ ํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.)

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฑธ๋กœ ํ•ด๋ด.

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

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

๋ช…๋ น ์ƒ์„ฑ์„ init ๋ฉ”์†Œ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  4 ๋Œ“๊ธ€

์ด๊ฑธ๋กœ ํ•ด๋ด.

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

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

๋ช…๋ น ์ƒ์„ฑ์„ init ๋ฉ”์†Œ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ–ˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ข‹์€ ๋ƒ„์ƒˆ์ž…๋‹ˆ๋‹ค. ๊ณ ๋งˆ์›Œ์š”, ์ œ๊ฐ€์žˆ๋Š”๋งŒํผํ•˜๋Š”๋ฐ ๋ฉฐ์น ์ด ๊ฑธ ๋ ธ์–ด์š”. ์ง€๋‚œ๋ฒˆ์— ๊ทธ๋Ÿฐ ์ ‘๊ทผ์„ ์‹œ๋„ํ–ˆ์„ ๋•Œ ๋ญ”๊ฐ€ ๋†“์นœ ๊ฒŒ ํ‹€๋ฆผ ์—†์–ด์š”.

์ฒœ๋งŒ์—์š”!

RAC (self.authenticatedUser) = [self.twitterLoginCommand.executionSignals switchToLatest];
๊ทธ๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜๋ฉด
RAC (self.authenticatedUser) = [self.twitterLoginCommand.executionSignals flatten];
๋” ๋‚˜์€? ๋ฟก๋ฟก

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰