fixes. add better objective-c support

This commit is contained in:
Erik 2015-03-11 17:33:21 -04:00
parent 8365ded215
commit 711ce8d8c4
5 changed files with 50 additions and 23 deletions

View File

@ -146,6 +146,21 @@ socket.emit("testData", [
"test": true]) "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 Detailed Example
================ ================
A more detailed example can be found [here](https://github.com/nuclearace/socket.io-client-swift-example) A more detailed example can be found [here](https://github.com/nuclearace/socket.io-client-swift-example)

View File

@ -24,9 +24,9 @@
import Foundation import Foundation
typealias AckCallback = (NSArray?) -> Void public typealias AckCallback = (NSArray?) -> Void
class SocketAckHandler { @objc public class SocketAckHandler {
let ackNum:Int! let ackNum:Int!
let event:String! let event:String!
var callback:AckCallback? var callback:AckCallback?

View File

@ -147,7 +147,8 @@ class SocketEngine: NSObject, WebSocketDelegate {
return 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.waitingForPoll = true
self.session.dataTaskWithRequest(req) {[weak self] data, res, err in self.session.dataTaskWithRequest(req) {[weak self] data, res, err in
@ -481,7 +482,6 @@ class SocketEngine: NSObject, WebSocketDelegate {
func sendPing() { func sendPing() {
if self.websocket { if self.websocket {
self.ws?.writePing(NSData())
self.sendWebSocketMessage("", withType: PacketType.PING) self.sendWebSocketMessage("", withType: PacketType.PING)
} else { } else {
self.sendPollMessage("", withType: PacketType.PING) self.sendPollMessage("", withType: PacketType.PING)

View File

@ -24,9 +24,9 @@
import Foundation import Foundation
typealias NormalCallback = (NSArray?, AckEmitter?) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void
typealias AnyHandler = (event:String, items:AnyObject?) public typealias AnyHandler = (event:String, items:AnyObject?)
typealias AckEmitter = (AnyObject...) -> Void public typealias AckEmitter = (AnyObject...) -> Void
private func emitAckCallback(socket:SocketIOClient, num:Int, type:Int) -> AckEmitter { private func emitAckCallback(socket:SocketIOClient, num:Int, type:Int) -> AckEmitter {
func emitter(items:AnyObject...) { func emitter(items:AnyObject...) {

View File

@ -24,7 +24,7 @@
import Foundation import Foundation
class SocketIOClient { public class SocketIOClient: NSObject {
let socketURL:NSMutableString! let socketURL:NSMutableString!
let ackQueue = dispatch_queue_create("ackQueue".cStringUsingEncoding(NSUTF8StringEncoding), let ackQueue = dispatch_queue_create("ackQueue".cStringUsingEncoding(NSUTF8StringEncoding),
DISPATCH_QUEUE_SERIAL) DISPATCH_QUEUE_SERIAL)
@ -57,7 +57,7 @@ class SocketIOClient {
} }
var sid:String? var sid:String?
init(socketURL:String, opts:[String: AnyObject]? = nil) { public init(socketURL:String, opts:[String: AnyObject]? = nil) {
var mutURL = RegexMutable(socketURL) var mutURL = RegexMutable(socketURL)
if mutURL["https://"].matches().count != 0 { if mutURL["https://"].matches().count != 0 {
@ -96,11 +96,13 @@ class SocketIOClient {
self.reconnectAttempts = -1 self.reconnectAttempts = -1
} }
super.init()
self.engine = SocketEngine(client: self, forcePolling: self.forcePolling) self.engine = SocketEngine(client: self, forcePolling: self.forcePolling)
} }
// Closes the socket // Closes the socket
func close() { public func close() {
self.closed = true self.closed = true
self.connecting = false self.connecting = false
self.connected = false self.connected = false
@ -109,7 +111,7 @@ class SocketIOClient {
} }
// Connects to the server // Connects to the server
func connect() { public func connect() {
if self.closed { if self.closed {
println("Warning! This socket was previously closed. This might be dangerous!") println("Warning! This socket was previously closed. This might be dangerous!")
self.closed = false self.closed = false
@ -119,7 +121,7 @@ class SocketIOClient {
} }
// Connect to the server using params // Connect to the server using params
func connectWithParams(params:[String: AnyObject]) { public func connectWithParams(params:[String: AnyObject]) {
if self.closed { if self.closed {
println("Warning! This socket was previously closed. This might be dangerous!") println("Warning! This socket was previously closed. This might be dangerous!")
self.closed = false self.closed = false
@ -139,6 +141,7 @@ class SocketIOClient {
self.currentReconnectAttempt = 0 self.currentReconnectAttempt = 0
self.reconnectTimer?.invalidate() self.reconnectTimer?.invalidate()
self.reconnectTimer = nil self.reconnectTimer = nil
self.handleEvent("connect", data: nil, isInternalMessage: false) self.handleEvent("connect", data: nil, isInternalMessage: false)
} }
@ -155,7 +158,7 @@ class SocketIOClient {
// Sends a message with multiple args // Sends a message with multiple args
// If a message contains binary we have to send those // If a message contains binary we have to send those
// seperately. // seperately.
func emit(event:String, _ args:AnyObject...) { public func emit(event:String, _ args:AnyObject...) {
if !self.connected { if !self.connected {
return 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 { if !self.connected {
return SocketAckHandler(event: "fail") return SocketAckHandler(event: "fail")
} }
@ -183,6 +191,10 @@ class SocketIOClient {
return ackHandler 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) { private func _emit(event:String, _ args:[AnyObject], ack:Bool = false) {
var frame:SocketEvent var frame:SocketEvent
var str:String var str:String
@ -217,7 +229,7 @@ class SocketIOClient {
} }
// If the server wants to know that the client received data // 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 dispatch_async(self.ackQueue) {[weak self] in
if self == nil || !self!.connected || data == nil { if self == nil || !self!.connected || data == nil {
return return
@ -270,7 +282,7 @@ class SocketIOClient {
} }
// Handles events // 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) { wantsAck ack:Int? = nil, withAckType ackType:Int = 3) {
// println("Should do event: \(event) with data: \(data)") // println("Should do event: \(event) with data: \(data)")
if !self.connected && !isInternalMessage { if !self.connected && !isInternalMessage {
@ -319,18 +331,18 @@ class SocketIOClient {
} }
// Adds handler for an event // 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) let handler = SocketEventHandler(event: name, callback: callback)
self.handlers.append(handler) self.handlers.append(handler)
} }
// Adds a handler for any event // Adds a handler for any event
func onAny(handler:(AnyHandler) -> Void) { public func onAny(handler:(AnyHandler) -> Void) {
self.anyHandler = handler self.anyHandler = handler
} }
// Opens the connection to the socket // Opens the connection to the socket
func open() { public func open() {
self.connect() self.connect()
} }
@ -497,7 +509,7 @@ class SocketIOClient {
} }
// Parses messages recieved // Parses messages recieved
func parseSocketMessage(stringMessage:String) { internal func parseSocketMessage(stringMessage:String) {
// println(message!) // println(message!)
// Check for successful namepsace connect // Check for successful namepsace connect
@ -718,7 +730,7 @@ class SocketIOClient {
} }
// Handles binary data // Handles binary data
func parseBinaryData(data:NSData) { internal func parseBinaryData(data:NSData) {
let shouldExecute = self.waitingData[0].addData(data) let shouldExecute = self.waitingData[0].addData(data)
if shouldExecute { if shouldExecute {
@ -763,7 +775,7 @@ class SocketIOClient {
} }
// Something happened while polling // Something happened while polling
func pollingDidFail(err:NSError?) { internal func pollingDidFail(err:NSError?) {
if !self.reconnecting { if !self.reconnecting {
self.connected = false self.connected = false
self.handleEvent("reconnect", data: err?.localizedDescription, isInternalMessage: true) self.handleEvent("reconnect", data: err?.localizedDescription, isInternalMessage: true)
@ -772,7 +784,7 @@ class SocketIOClient {
} }
// We lost connection and should attempt to reestablish // We lost connection and should attempt to reestablish
@objc func tryReconnect() { internal func tryReconnect() {
if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts { if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts {
self.didForceClose() self.didForceClose()
return return