Browse Source

Split webSocket:didReceiveMessage: into string/data methods.

Nikita Lutsenko 9 years ago
parent
commit
621d3961bb

+ 3 - 0
SocketRocket/Internal/Delegate/SRDelegateController.h

@@ -14,6 +14,9 @@
 NS_ASSUME_NONNULL_BEGIN
 
 struct SRDelegateAvailableMethods {
+    BOOL didReceiveMessage : 1;
+    BOOL didReceiveMessageWithString : 1;
+    BOOL didReceiveMessageWithData : 1;
     BOOL didOpen : 1;
     BOOL didFailWithError : 1;
     BOOL didCloseWithCode : 1;

+ 3 - 0
SocketRocket/Internal/Delegate/SRDelegateController.m

@@ -50,6 +50,9 @@ NS_ASSUME_NONNULL_BEGIN
         _delegate = delegate;
 
         self.availableDelegateMethods = (SRDelegateAvailableMethods){
+            .didReceiveMessage = [delegate respondsToSelector:@selector(webSocket:didReceiveMessage:)],
+            .didReceiveMessageWithString = [delegate respondsToSelector:@selector(webSocket:didReceiveMessageWithString:)],
+            .didReceiveMessageWithData = [delegate respondsToSelector:@selector(webSocket:didReceiveMessageWithData:)],
             .didOpen = [delegate respondsToSelector:@selector(webSocketDidOpen:)],
             .didFailWithError = [delegate respondsToSelector:@selector(webSocket:didFailWithError:)],
             .didCloseWithCode = [delegate respondsToSelector:@selector(webSocket:didCloseWithCode:reason:wasClean:)],

+ 28 - 3
SocketRocket/SRWebSocket.h

@@ -151,11 +151,36 @@ extern NSString *const SRHTTPResponseErrorKey;
 
 @protocol SRWebSocketDelegate <NSObject>
 
-// message will either be an NSString if the server is using text
-// or NSData if the server is using binary.
+@optional
+
+#pragma mark Receive Messages
+
+/**
+ Called when any message was received from a web socket.
+ This method is suboptimal and might be deprecated in a future release.
+
+ @param webSocket An instance of `SRWebSocket` that received a message.
+ @param message   Received message. Either a `String` or `NSData`.
+ */
 - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;
 
-@optional
+/**
+ Called when a frame was received from a web socket.
+
+ @param webSocket An instance of `SRWebSocket` that received a message.
+ @param string    Received text in a form of UTF-8 `String`.
+ */
+- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessageWithString:(NSString *)string;
+
+/**
+ Called when a frame was received from a web socket.
+
+ @param webSocket An instance of `SRWebSocket` that received a message.
+ @param data      Received data in a form of `NSData`.
+ */
+- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessageWithData:(NSData *)data;
+
+#pragma mark Status & Connection
 
 - (void)webSocketDidOpen:(SRWebSocket *)webSocket;
 - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;

+ 24 - 12
SocketRocket/SRWebSocket.m

@@ -697,14 +697,6 @@ NSString *const SRHTTPResponseErrorKey = @"HTTPResponseStatusCode";
     }];
 }
 
-- (void)_handleMessage:(id)message
-{
-    SRFastLog(@"Received message");
-    [self.delegateController performDelegateBlock:^(id<SRWebSocketDelegate>  _Nullable delegate, SRDelegateAvailableMethods availableMethods) {
-        [delegate webSocket:self didReceiveMessage:message];
-    }];
-}
-
 
 static inline BOOL closeCodeIsValid(int closeCode) {
     if (closeCode < 1000) {
@@ -813,18 +805,38 @@ static inline BOOL closeCodeIsValid(int closeCode) {
                 });
                 return;
             }
+            SRFastLog(@"Received text message.");
             [self.delegateController performDelegateBlock:^(id<SRWebSocketDelegate>  _Nullable delegate, SRDelegateAvailableMethods availableMethods) {
                 // Don't convert into string - iff `delegate` tells us not to. Otherwise - create UTF8 string and handle that.
                 if (availableMethods.shouldConvertTextFrameToString && ![delegate webSocketShouldConvertTextFrameToString:self]) {
-                    [delegate webSocket:self didReceiveMessage:frameData];
+                    if (availableMethods.didReceiveMessage) {
+                        [delegate webSocket:self didReceiveMessage:frameData];
+                    }
+                    if (availableMethods.didReceiveMessageWithData) {
+                        [delegate webSocket:self didReceiveMessageWithData:frameData];
+                    }
                 } else {
-                    [delegate webSocket:self didReceiveMessage:string];
+                    if (availableMethods.didReceiveMessage) {
+                        [delegate webSocket:self didReceiveMessage:string];
+                    }
+                    if (availableMethods.didReceiveMessageWithString) {
+                        [delegate webSocket:self didReceiveMessageWithString:string];
+                    }
                 }
             }];
             break;
         }
-        case SROpCodeBinaryFrame:
-            [self _handleMessage:frameData];
+        case SROpCodeBinaryFrame: {
+            SRFastLog(@"Received data message.");
+            [self.delegateController performDelegateBlock:^(id<SRWebSocketDelegate>  _Nullable delegate, SRDelegateAvailableMethods availableMethods) {
+                if (availableMethods.didReceiveMessage) {
+                    [delegate webSocket:self didReceiveMessage:frameData];
+                }
+                if (availableMethods.didReceiveMessageWithData) {
+                    [delegate webSocket:self didReceiveMessageWithData:frameData];
+                }
+            }];
+        }
             break;
         case SROpCodeConnectionClose:
             [self handleCloseWithData:frameData];