iOS开发

IOS —SocketIOClient.swift 使用小结

2018-09-15  本文已影响1人  Superman168

IOS Socket.IO-Client

问题小结:

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 内部原理的话调试过程比较艰辛,一步一步排查,尤其是在项目代码逻辑异常复杂时更是麻烦。

上一篇下一篇

猜你喜欢

热点阅读