RACSignalのサブクラスであるRACSubjectは、メソッドにsendNext:、sendError:、sendCompletedを持っているので、自分でイベントを送信する機能を持っています。
これらのメソッドを使うと、ReactiveCocoaのFramework Overviewにある通り、非RACなものからシグナルを出すことができるようになります。
今回はそのような利用例として、IIJmioのiOSサンプルアプリでのOAuth認証での事例を紹介します。
インタフェースにOAuth用のRACSubjectを持たせています。
@interface MIORestHelper () @property RACSubject* authSignal; @end
これは、UIWebViewを作ってloadRequest:を出すときに初期化しています。
ここではシグナルの初期化と、シグナル終了時の処理ブロックを追加しているだけです。
- (RACSignal*)authorizeInView:(UIView*)view {
    UIWebView* webview = [[UIWebView alloc] init];
    webview.delegate = self;
    [webview loadRequest:self.authorizeRequest];
    [view addSubview:webview];
    webview.frame = view.frame;
    self.authSignal = [RACSubject subject];
    return [self.authSignal finally:^{
        webview.delegate = nil;
        [webview removeFromSuperview];
    }];
}
実際にイベントを送信するのは、shouldStartLoadWithRequest:navigationType:とwebView:didFailLoadWithError:で行っています。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSURL* redirect = [NSURL URLWithString:self.redirectURI];
    if ([request.URL.host isEqualToString:redirect.host]) {
        if ([self checkAccessToken:request]) {
            [self.authSignal sendCompleted];
        } else {
            [self.authSignal sendError:nil];
        }
    }
    return TRUE;
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    [self.authSignal sendError:error];
}
ここでは、次のようにイベントを送信しています。
- OAuthのリダイレクト先であるかとアクセストークンが付いているかをチェックして、そうだったらCompletedイベントを送信
 - リダイレクト先であるが、アクセストークンがないならErrorイベントを送信
 webView:didFailLoadWithError:ならErrorイベントを送信
nextイベントは送信していません。

0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。