From 711ce8d8c428516ec008f598f18281984f30290e Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 11 Mar 2015 17:33:21 -0400 Subject: [PATCH] fixes. add better objective-c support --- README.md | 15 +++++++++++ SwiftIO/SocketAckHandler.swift | 4 +-- SwiftIO/SocketEngine.swift | 4 +-- SwiftIO/SocketEventHandler.swift | 6 ++--- SwiftIO/SocketIOClient.swift | 44 ++++++++++++++++++++------------ 5 files changed, 50 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 3ac0c44..45f6a01 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,21 @@ socket.emit("testData", [ "test": true]) ``` +Objective-C Example +=================== +```objective-c +SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" opts:nil]; + +[socket on: @"connect" callback: ^(NSArray* data, void (^ack)(NSArray*)) { + NSLog(@"connected"); + [socket emitObjc:@"echo" :@[@"echo test"]]; + [[socket emitWithAckObjc:@"ackack" :@[@"test"]] onAck:^(NSArray* data) { + NSLog(@"Got data"); + }]; +}]; + +``` + Detailed Example ================ A more detailed example can be found [here](https://github.com/nuclearace/socket.io-client-swift-example) diff --git a/SwiftIO/SocketAckHandler.swift b/SwiftIO/SocketAckHandler.swift index db4fe3f..bc506a0 100644 --- a/SwiftIO/SocketAckHandler.swift +++ b/SwiftIO/SocketAckHandler.swift @@ -24,9 +24,9 @@ import Foundation -typealias AckCallback = (NSArray?) -> Void +public typealias AckCallback = (NSArray?) -> Void -class SocketAckHandler { +@objc public class SocketAckHandler { let ackNum:Int! let event:String! var callback:AckCallback? diff --git a/SwiftIO/SocketEngine.swift b/SwiftIO/SocketEngine.swift index 817097a..4aeabca 100644 --- a/SwiftIO/SocketEngine.swift +++ b/SwiftIO/SocketEngine.swift @@ -147,7 +147,8 @@ class SocketEngine: NSObject, WebSocketDelegate { return } - let req = NSURLRequest(URL: NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!) + let req = NSMutableURLRequest(URL: NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!) + req.timeoutInterval = 0.0 self.waitingForPoll = true self.session.dataTaskWithRequest(req) {[weak self] data, res, err in @@ -481,7 +482,6 @@ class SocketEngine: NSObject, WebSocketDelegate { func sendPing() { if self.websocket { - self.ws?.writePing(NSData()) self.sendWebSocketMessage("", withType: PacketType.PING) } else { self.sendPollMessage("", withType: PacketType.PING) diff --git a/SwiftIO/SocketEventHandler.swift b/SwiftIO/SocketEventHandler.swift index 2294025..09f99b7 100644 --- a/SwiftIO/SocketEventHandler.swift +++ b/SwiftIO/SocketEventHandler.swift @@ -24,9 +24,9 @@ import Foundation -typealias NormalCallback = (NSArray?, AckEmitter?) -> Void -typealias AnyHandler = (event:String, items:AnyObject?) -typealias AckEmitter = (AnyObject...) -> Void +public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void +public typealias AnyHandler = (event:String, items:AnyObject?) +public typealias AckEmitter = (AnyObject...) -> Void private func emitAckCallback(socket:SocketIOClient, num:Int, type:Int) -> AckEmitter { func emitter(items:AnyObject...) { diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index 020b977..a61e838 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -24,7 +24,7 @@ import Foundation -class SocketIOClient { +public class SocketIOClient: NSObject { let socketURL:NSMutableString! let ackQueue = dispatch_queue_create("ackQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) @@ -57,7 +57,7 @@ class SocketIOClient { } var sid:String? - init(socketURL:String, opts:[String: AnyObject]? = nil) { + public init(socketURL:String, opts:[String: AnyObject]? = nil) { var mutURL = RegexMutable(socketURL) if mutURL["https://"].matches().count != 0 { @@ -96,11 +96,13 @@ class SocketIOClient { self.reconnectAttempts = -1 } + super.init() + self.engine = SocketEngine(client: self, forcePolling: self.forcePolling) } // Closes the socket - func close() { + public func close() { self.closed = true self.connecting = false self.connected = false @@ -109,7 +111,7 @@ class SocketIOClient { } // Connects to the server - func connect() { + public func connect() { if self.closed { println("Warning! This socket was previously closed. This might be dangerous!") self.closed = false @@ -119,7 +121,7 @@ class SocketIOClient { } // Connect to the server using params - func connectWithParams(params:[String: AnyObject]) { + public func connectWithParams(params:[String: AnyObject]) { if self.closed { println("Warning! This socket was previously closed. This might be dangerous!") self.closed = false @@ -139,6 +141,7 @@ class SocketIOClient { self.currentReconnectAttempt = 0 self.reconnectTimer?.invalidate() self.reconnectTimer = nil + self.handleEvent("connect", data: nil, isInternalMessage: false) } @@ -155,7 +158,7 @@ class SocketIOClient { // Sends a message with multiple args // If a message contains binary we have to send those // seperately. - func emit(event:String, _ args:AnyObject...) { + public func emit(event:String, _ args:AnyObject...) { if !self.connected { return } @@ -166,7 +169,12 @@ class SocketIOClient { } } - func emitWithAck(event:String, _ args:AnyObject...) -> SocketAckHandler { + // Objc doesn't have variadics + public func emitObjc(event:String, _ args:[AnyObject]) { + self.emit(event, args) + } + + public func emitWithAck(event:String, _ args:AnyObject...) -> SocketAckHandler { if !self.connected { return SocketAckHandler(event: "fail") } @@ -183,6 +191,10 @@ class SocketIOClient { return ackHandler } + public func emitWithAckObjc(event:String, _ args:[AnyObject]) -> SocketAckHandler { + return self.emitWithAck(event, args) + } + private func _emit(event:String, _ args:[AnyObject], ack:Bool = false) { var frame:SocketEvent var str:String @@ -217,7 +229,7 @@ class SocketIOClient { } // If the server wants to know that the client received data - func emitAck(ack:Int, withData data:[AnyObject]?, withAckType ackType:Int) { + internal func emitAck(ack:Int, withData data:[AnyObject]?, withAckType ackType:Int) { dispatch_async(self.ackQueue) {[weak self] in if self == nil || !self!.connected || data == nil { return @@ -270,7 +282,7 @@ class SocketIOClient { } // Handles events - func handleEvent(event:String, data:AnyObject?, isInternalMessage:Bool = false, + public func handleEvent(event:String, data:AnyObject?, isInternalMessage:Bool = false, wantsAck ack:Int? = nil, withAckType ackType:Int = 3) { // println("Should do event: \(event) with data: \(data)") if !self.connected && !isInternalMessage { @@ -319,18 +331,18 @@ class SocketIOClient { } // Adds handler for an event - func on(name:String, callback:NormalCallback) { + public func on(name:String, callback:NormalCallback) { let handler = SocketEventHandler(event: name, callback: callback) self.handlers.append(handler) } // Adds a handler for any event - func onAny(handler:(AnyHandler) -> Void) { + public func onAny(handler:(AnyHandler) -> Void) { self.anyHandler = handler } // Opens the connection to the socket - func open() { + public func open() { self.connect() } @@ -497,7 +509,7 @@ class SocketIOClient { } // Parses messages recieved - func parseSocketMessage(stringMessage:String) { + internal func parseSocketMessage(stringMessage:String) { // println(message!) // Check for successful namepsace connect @@ -718,7 +730,7 @@ class SocketIOClient { } // Handles binary data - func parseBinaryData(data:NSData) { + internal func parseBinaryData(data:NSData) { let shouldExecute = self.waitingData[0].addData(data) if shouldExecute { @@ -763,7 +775,7 @@ class SocketIOClient { } // Something happened while polling - func pollingDidFail(err:NSError?) { + internal func pollingDidFail(err:NSError?) { if !self.reconnecting { self.connected = false self.handleEvent("reconnect", data: err?.localizedDescription, isInternalMessage: true) @@ -772,7 +784,7 @@ class SocketIOClient { } // We lost connection and should attempt to reestablish - @objc func tryReconnect() { + internal func tryReconnect() { if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts { self.didForceClose() return