ReactiveCocoa 結合 XMPP 學習筆記 第二部分

這里接著 第一部分 繼續(xù)

這里是對ReactiveCocoa 框架學習的一個實踐,不是技術性的文章,可行性還有待商榷。

首先思考一下使用XMPP登陸的流程大致為:

一般來說會將使用XMPP的方法都寫在一個工具類設置為單例

根據(jù)上面的流程嘗試寫一個使用ReactiveCocoa的登錄過程

這里要擴充一個方法[self rac_signalForSelector:SEL] 用來監(jiān)聽代理方法是否執(zhí)行了

首先寫一個登錄方法 使用block返回登錄結果

實現(xiàn)登錄方法:
<code>
- (void)login:(XMPPLoginBlock)resultBlock {
//開始連接服務器
[self connectHost]; //在這里傳入?yún)?shù)第一次握手
}
</code>
如果成功建立連接會調用代理方法 使用 rac_signalForSelector:SEL 方法監(jiān)聽

<code>
- (void)login:(XMPPLoginBlock)resultBlock {
//開始連接服務器
[self connectHost]; //在這里傳入?yún)?shù)第一次握手
//連接成功
[[[self rac_signalForSelector:@selector(xmppStreamDidConnect:)] doNext:^(id x) {
//發(fā)送密碼進行第二次握手
[self sendPwdToHost];
}] subscribeNext:^(id x) {
//返回結果給Block
resultBlock(XMPPToolConnectSuccess);
}];
}
</code>
接下來是授權成功
<code>
- (void)login:(XMPPLoginBlock)resultBlock {
//開始連接服務器
[self connectHost]; //在這里傳入?yún)?shù)第一次握手
//連接成功
[[[self rac_signalForSelector:@selector(xmppStreamDidConnect:)] doNext:^(id x) {
//發(fā)送密碼進行第二次握手
[self sendPwdToHost];
}] subscribeNext:^(id x) {
//返回結果給Block
resultBlock(XMPPToolConnectSuccess);
}];
</code>

登錄成功
<code>
[[[self rac_signalForSelector:@selector(xmppStreamDidAuthenticate:)] doNext:^(id x) {
//發(fā)送現(xiàn)在消息第三次握手
[self sendOnlineToHost];
}] subscribeNext:^(id x) {
resultBlock(XMPPToolLoginSuccess);
}];
}
</code>
好了簡單的一個過程就寫好了 這里resultBlock內是自定義的枚舉

接著完善一下第一部分中的代碼 添加對按鈕點擊監(jiān)聽
<code>
[[self.login rac_signalForControlEvents:UIControlEventTouchUpInside]
subscribeNext:^(id x) {
}
</code>
因為這里要跳轉控制器 所以 加 deliverOn:[RACScheduler mainThreadScheduler] 保證在主線程安全跳轉 執(zhí)行在單例中的方法:
<code>
[[[self.login rac_signalForControlEvents:UIControlEventTouchUpInside] deliverOn:[RACScheduler mainThreadScheduler]]
subscribeNext:^(id x) {
[[XMPPTool sharedXMPPTool] login:^(XMPPToolLoginResult result) {
if (result == XMPPToolLoginSuccess) {
dispatch_async(dispatch_get_main_queue(), ^{
TestController *testVC = [[TestController alloc] init];
UINavigationController *navVC=[[UINavigationController alloc] initWithRootViewController:testVC];
[UIApplication sharedApplication].keyWindow.rootViewController = navVC;
});
}
}];
}];
</code>

如果需要做其他如連接失敗,密碼錯誤等 和上面一樣 擴充枚舉就可以了

看下整個登陸的代碼過程的代碼別集中在了一起

<code>
//登陸

  • (void)login:(XMPPLoginBlock)resultBlock {
    //開始連接服務器
    [self connectHost];
    //連接成功
    [[[self rac_signalForSelector:@selector(xmppStreamDidConnect:)]
    doNext:^(id x) {
    [self sendPwdToHost];
    }]
    subscribeNext:^(id x) {
    resultBlock(XMPPToolConnectSuccess);
    }];
    //登錄成功
    [[[self rac_signalForSelector:@selector(xmppStreamDidAuthenticate:)]
    doNext:^(id x) {
    [self sendOnlineToHost];
    }]
    subscribeNext:^(id x) {
    resultBlock(XMPPToolLoginSuccess);
    }];
    //連接失敗
    [[self rac_signalForSelector:@selector(xmppStreamDidDisconnect:withError:)]
    subscribeNext:^(id x) {
    resultBlock(XMPPToolConnectFailed);
    }];
    //授權失敗
    [[[self rac_signalForSelector:@selector(xmppStream:didNotAuthenticate:)]
    doNext:^(id x) {
    [_xmppStream disconnect];
    }]
    subscribeNext:^(id x) {
    resultBlock(XMPPToolLoginFailed);
    }];
    }
    </code>
    注意到這次沒有使用__weak 來處理block 因為這里使用的是單例不需要被銷毀,實際開發(fā)還有視情況而定 畢竟單例會一直占用內存。

由于剛開始初學ReactiveCocoa 一些高級用法還有接觸 以后慢慢改進 下一篇 開始嘗試獲取好友列表 這里是 第三部分 獲取好友列表
完整Dome

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容