IOS Socket.IO-Client
问题小结:
- Socket 始终接收不到回调消息的问题;
Socket 初始化:
/**
* 进来先连接socket,连通以后再进行下面的操作
*/
-(void)socketConnect:(NSString *)planId type:(NSString *)type
{
NSURL* url = [[NSURL alloc] initWithString:SocketUrl];
NSLog(@"%@",SocketUrl);
seatSocket = [[SocketIOClient alloc] initWithSocketURL:url config:@{@"log": @YES, @"forcePolling": @YES}];
[seatSocket on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
NSLog(@"连接成功");
//先请求默认的日票socket --- <判断是否存在planId,如果不存在socket不进行连接>
if (planId && planId.length!=0)
{
[self getSocket:planId type:type];
}
}];
}
Socket 初始化之后,一定记得,连接:
[seatSocket connect];
因为不小心注释始终接收不到回调,并且通过这个判断是判断不出来 Socket 的连接状态的:
if (seatSocket.status == SocketIOClientStatusDisconnected)
{
NSURL* url = [[NSURL alloc] initWithString:SocketUrl];
NSLog(@"%@",SocketUrl);
seatSocket = [[SocketIOClient alloc] initWithSocketURL:url config:@{@"log": @YES, @"forcePolling": @YES}];
[seatSocket on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
NSLog(@"连接成功");
}];
[seatSocket connect];
}else{
//连接socket
}
是不是有点很不智能呢???
另外有可能是其它的原因,这只是我遇到的一次。
open 进入房间:
NSArray * arr =[[NSArray alloc]initWithObjects:pdict, nil];
NSLog(@"%@",arr);
[pSocket emit:@"open" with:arr];
监听回调:
NSArray * arr1 =[[NSArray alloc]initWithObjects:pdict1, nil];
[pSocket emit:@"manyTicket" with:arr1];
[pSocket on:[NSString stringWithFormat:@"%@",lineId] callback:^(NSArray* data, SocketAckEmitter* ack) {
[SVProgressHUD dismiss];
}];
今天遇到一个很奇葩的问题,在 Socket 的 on 中有一些逻辑判断需要根据外部的变量来判断,每次动态传入,但是 Socket 内部只保留了第一次进入 Socket 时 的外部变量值,在传入之前改变了传入的值,但是 在 Socket 内部依然是上次进入 Socket 时的值,导致程序始终出现问题,猜测因为是在内存的不同区域,在 on 内部访问不了最新的值的变化;故采取了利用 NSUserDefaults 来保存,
- 每次获取到最新值时,保存到本地
// 票类型存到本地,解决在 Socket 内部访问不了最新的变量值
[UserDefaults setObject:type forKey:@"ticketType"];
[UserDefaults synchronize];
在 Soket on 方法内部访问,一定要记住是在 Soket on 方法内部访问,在 on 之外读取也是无效果的,类似 OC 的 Block。
// 本地取当前类型
NSString *curTicketType = [UserDefaults objectForKey:@"ticketType"];
if (curTicketType.intValue == TicketTypeWeek) {
逻辑判断
}
这样简单的处理一下,算是解决了问题,只是不了解 Socket 内部原理的话调试过程比较艰辛,一步一步排查,尤其是在项目代码逻辑异常复杂时更是麻烦。
附
Socket.IO-Client-Swift Github 链接
https://github.com/socketio/socket.io-client-swift