SocketRocket调用一个开放的连接

时间:2013-06-26 12:04:31

标签: ios objective-c socketrocket

我目前在appdelegate.m

中有一个socketrocket连接
_webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"ws://pinkfalcon.nl:12345/connectr"]]];
_webSocket.delegate = self;
[_webSocket open];

对此的回应

- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
{
    [self.window makeKeyAndVisible];
    NSLog(@"Websocket Connected");
}

如何从其他视图请求该部分。我似乎无法找到一个委托函数来打开套接字火箭上的当前连接。我似乎无法找到委托函数的逻辑。

1 个答案:

答案 0 :(得分:1)

如果您的_webSocket ivar可用作AppDelegate的(希望只读)属性,则可以从代码中的其他位置检查套接字的状态:

if ([UIApplication sharedApplication].delegate.webSocket.readyState == SR_OPEN) {}

列举了不同的状态here。更好的是将这种检查封装到- (BOOL)socketIsOpen中的- (BOOL)socketIsClosedAppDelegate等方法中。

此外,如果您希望套接字开放触发应用程序的其他操作,您可能希望使用类似NSNotificationCenter的内容,因此可以通知应用程序的任何部分何时套接字打开,以及何时它已关闭:

- (void)webSocketDidOpen:(SRWebSocket *)webSocket {
    // your existing code
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center postNotificationName:@"myapp.websocket.open" object:webSocket];
}

- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code
           reason:(NSString *)reason
         wasClean:(BOOL)wasClean; {

    // your code
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center postNotificationName:@"myapp.websocket.close" 
                          object:webSocket
                        userInfo:@{
        @"code": @(code), 
        @"reason": reason, 
        @"clean": @(wasClean)
    }];
}

这将允许您的应用的其他部分执行:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(socketDidOpen:)
                                             name:@"myapp.websocket.open"
                                           object:nil];

其中socketDidOpen:将采用单个NSNotification*参数。

作为一般建议,您不应等待在创建UIWindow键之前打开websocket连接,因为如果没有可用的连接,这将使您的用户不得不使用您的应用程序。在一般情况下,连接设置应在后台进行管理,并与设置应用程序UI异步。