Skip to content

Repository files navigation

SocketCenter

基于SocketRocket的上层封装,在iOSMacOS平台提供Socket通信功能。包含以下特性:

  • 支持断线重连
  • 支持定时向服务端发送心跳包
  • App进入后台自动关闭Socket
  • App回到前台自动重连Socket
  • 支持delegateblock回调,使用更方便

安装

pod'SocketCenter'

使用

基本使用

//创建socket
self.socket = [[SocketCenter alloc]initWebSocketWithUrl:url];
//socket 打开
self.socket.openBlock = ^(SocketCenter *weakSocket) {
//向服务端发送数据
[weakSocket send:@"data"];
};
//收到服务端数据
self.socket.receiveBlock = ^(SocketCenter *weakSocket, id message) {
NSLog(@"%@",message);
};
//socket链接出错
self.socket.failureBlock = ^(SocketCenter *weakSocket, NSError *error) {
};

功能介绍

使用struct优化delegate响应速度

在长连接的业务的使用场景中,数据的交互往往是很频繁的,因此有必要减少不必要的逻辑。一般我们使用respondsToSelector来判断委托对象是否实现了相关的方法,但是每次都要从方法列表查找则显得略微笨重,因此选择使用struct优化方法查找效率

//定义一个结构体,用来判断是否响应协议
{
struct {
unsignedint responseToReceiveMsg : 1;
unsignedint responseToOpen : 1;
unsignedint responseToClose : 1;
unsignedint responseToFail : 1;
unsignedint responseToPong : 1;
} _delegateFlags;
}
//设置代理的时候,判断是否响应
- (void)setDelegate:(id<SocketCenterDelegate>)delegate{
_delegate = delegate;
_delegateFlags.responseToReceiveMsg = [delegate respondsToSelector:@selector(webSocket:didReceiveMessage:)];
_delegateFlags.responseToFail = [delegate respondsToSelector:@selector(webSocket:didFailWithError:)];
_delegateFlags.responseToOpen = [delegate respondsToSelector:@selector(webSocketDidOpen:)];
_delegateFlags.responseToClose = [delegate respondsToSelector:@selector(webSocket:didCloseWithCode:reason:wasClean:)];
_delegateFlags.responseToPong = [delegate respondsToSelector:@selector(webSocket:didReceivePong:)];
}
//在delegate中使用struct判断是否响应
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error{
if (_delegateFlags.responseToFail) {
[_delegate webSocket:selfdidFailWithError:error];
}
}

使用block

考虑到开发中可能存在一个ViewController中有多个socket对象的情况,以及提高代码紧凑性,因此所有的delegate都提供了block形式的回调 使用示例

self.socket.openBlock = ^(SocketCenter *weakSocket) {
[weakSocket send:@"data"];
};

block回传的SocketCenter参数是经过weak关键字处理的,在block中使用该参数不会发生循环引用

自动重连

self.socket.autoReconnect = true;

在网络断开恢复后,会自动进行重连

App状态处理

self.socket.autoRefreshState = true;

在App进入后台会自动关闭socket,避免性能损耗;App回到前台后会自动重连

发送心跳数据

self.socket.openBlock = ^(SocketCenter *weakSocket) {
[weakSocket sendPing:data timeInterval:5]
};

About

iOS Socket封装,支持断线重连、心跳机制

Topics

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages