我目前在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");
}
如何从其他视图请求该部分。我似乎无法找到一个委托函数来打开套接字火箭上的当前连接。我似乎无法找到委托函数的逻辑。
答案 0 :(得分:1)
如果您的_webSocket
ivar可用作AppDelegate
的(希望只读)属性,则可以从代码中的其他位置检查套接字的状态:
if ([UIApplication sharedApplication].delegate.webSocket.readyState == SR_OPEN) {}
列举了不同的状态here。更好的是将这种检查封装到- (BOOL)socketIsOpen
中的- (BOOL)socketIsClosed
或AppDelegate
等方法中。
此外,如果您希望套接字开放触发应用程序的其他操作,您可能希望使用类似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异步。