0

我目前在我的 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");
}

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

4

1 回答 1

1

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

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

这里列举了不同的状态。更好的做法是将这种检查封装到方法中,- (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];

wheresocketDidOpen:需要一个NSNotification*参数。

但是,作为一般建议,您不应等待 websocket 连接打开,然后再使 UIWindow 键可见,因为如果没有可用的连接,这会使您的用户无法使用您的应用程序。在一般情况下,连接设置应在后台管理,并与设置应用程序 UI 异步。

于 2013-06-26T12:47:13.617 回答