// // ReconnectControl.m // HeBeiFM // // Created by Apple on 16/9/22. // Copyright © 2016年 Apple. All rights reserved. /** 断线流程是 每六秒连接一次 如果30秒仍未连接上则通知UI掉线,之后仍然继续连接,知道连接上为止 */ #import "ReconnectControl.h" #import "GCDAsyncSocket.h" #import "Socket.h" @interface ReconnectControl () { //用于通知UI断线 VoidBlock _UIBlock; //用于通知socket连接成功 VoidBlock _successBlock; //定时器 NSTimer *_reconnectTimer; //socket GCDAsyncSocket *_socket; //重连次数 NSInteger _reconnectCount; } @end @implementation ReconnectControl +(ReconnectControl *)shareControl { static ReconnectControl *control; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ control = [ReconnectControl new]; }); return control; } -(void)startReconnectBlock:(VoidBlock)noticeUI success:(VoidBlock)success { _UIBlock = noticeUI; _successBlock = success; _reconnectCount = 0; [_reconnectTimer invalidate]; _reconnectTimer = [NSTimer scheduledTimerWithTimeInterval:6 target:self selector:@selector(reconnect) userInfo:nil repeats:true]; _status = Reconnecting; } -(void)reconnect { //当连续5次没有连接成功时通知UI显示断网提示 if (_reconnectCount == 5) { _UIBlock(); } _reconnectCount += 1; [self connectHost]; } //连接服务器 -(void)connectHost { _socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; NSError *error = nil; [_socket connectToHost:[Socket sharedInstance].socketHost onPort:[Socket sharedInstance].socketPort withTimeout:3 error:&error]; } /** 连接成功后,断开Socket,通知正在等待连接的socket和UI */ -(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port { _successBlock(); _status = ReconnecNone; _reconnectCount = 0; [_reconnectTimer invalidate]; [_socket disconnect]; _socket.delegate = nil; NSLog(@"连接成功"); } @end