2013-06-26 3 views
0

я в настоящее время имею связь socketrocket в моем appdelegate.mSocketRocket вызов открытого соединения

_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

Если _webSocket Ивар доступна как (надеюсь, только для чтения) свойство вашего 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* аргумент.

Как правило, вам не следует ждать, пока соединение с websocket будет открыто, прежде чем сделать свой ключ UIWindow и видимым, так как это сделает ваш пользователь неспособным использовать ваше приложение, если соединение не доступно. В общем случае настройка подключения должна управляться в фоновом режиме и быть асинхронной с настройкой пользовательского интерфейса приложения.

+0

Вы, сэр, сделали работу! Я всегда стараюсь избегать центра уведомлений. Кажется, это не похоже на твердое решение. Но сейчас это трюк. Спасибо друг. –

+1

В некоторых случаях я также стараюсь избегать NSNotificationCenter, напрямую строя методы регистрации наблюдателей и уведомляя их, но тогда вам необходимо поддерживать список наблюдателей, следить за сохранением циклов и безопасностью потоков. В большинстве случаев это избыток :) – matehat

Смежные вопросы