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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。