我目前在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");
}
我怎么能从另一个角度要求那个部分呢。我似乎找不到一个代理函数来打开套接字火箭上的当前连接。我似乎找不到委托函数的逻辑。
如果您的_webSocket
ivar作为AppDelegate
的属性(希望是只读的)可用,那么您可以从代码的其他地方检查套接字的状态为:
if ([UIApplication sharedApplication].delegate.webSocket.readyState == SR_OPEN) {}
这里列举了不同的状态。更好的做法是将这类检查封装到AppDelegate
中的- (BOOL)socketIsOpen
或- (BOOL)socketIsClosed
等方法中。
此外,如果你想让套接字打开来触发应用程序的其他操作,你可能想使用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];
其中CCD_ 7将采用单个CCD_。
不过,一般建议是,你不应该等到打开websocket连接后才让你的UIWindow密钥可见,因为如果没有连接,你的用户将无法使用你的应用程序。在一般情况下,连接设置应该在后台管理,并且与设置应用程序UI异步。