Tweaks for performance

This commit is contained in:
Erik 2015-03-20 15:23:38 -04:00
parent 2837c7c42c
commit 18b8f992d9
4 changed files with 78 additions and 127 deletions

View File

@ -47,11 +47,11 @@ public class SocketEngine: NSObject, WebSocketDelegate {
unowned let client:SocketEngineClient
private let workQueue = NSOperationQueue()
private let emitQueue = dispatch_queue_create(
"emitQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
"engineEmitQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
private let parseQueue = dispatch_queue_create(
"parseQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
"engineParseQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
private let handleQueue = dispatch_queue_create(
"handleQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
"engineHandleQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
private let session:NSURLSession!
private var _connected = false
private var fastUpgrade = false
@ -91,7 +91,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
func close() {
self.pingTimer?.invalidate()
self.send(PacketType.CLOSE.rawValue)
self.send(PacketType.CLOSE.rawValue, withData: nil)
}
private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) {
@ -270,7 +270,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
}
// A poll failed, tell the client about it
private func handlePollingFailed(reason:NSError?) {
private func handlePollingFailed(reason:NSError) {
assert(self.polling, "Polling failed when we're not polling")
if !self.client.reconnecting {
@ -422,12 +422,6 @@ public class SocketEngine: NSObject, WebSocketDelegate {
fixDoubleUTF8(&message)
}
// We should upgrade
if message == "3probe" {
self.upgradeTransport()
return
}
let type = message["^(\\d)"].groups()?[1]
if type != PacketType.MESSAGE.rawValue {
@ -452,8 +446,12 @@ public class SocketEngine: NSObject, WebSocketDelegate {
self.doPoll()
return
} else if type == PacketType.PONG.rawValue {
// We should upgrade
if message == "3probe" {
self.upgradeTransport()
return
}
}
if message == PacketType.CLOSE.rawValue {
// do nothing
@ -481,7 +479,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
/*
Send a message with type 4
*/
public func send(msg:String, datas:[NSData]? = nil) {
public func send(msg:String, withData datas:[NSData]?) {
if self.probing {
self.probeWait.append((msg, PacketType.MESSAGE, datas))
} else {

View File

@ -210,20 +210,9 @@ class SocketEvent {
return newDict
}
func fillInPlaceholders(_ args:AnyObject = true) -> AnyObject {
if let dict = args as? NSDictionary {
return self.fillInDict(dict)
} else if let arr = args as? NSArray {
return self.fillInArray(args as NSArray)
} else if let string = args as? String {
if string == "~~\(self.currentPlace)" {
return self.datas[0]
}
} else if args is Bool {
// We have multiple items
// Do it live
func fillInPlaceholders() -> NSArray? {
let argsAsArray = "[\(self.args)]"
if let parsedArr = SocketParser.parseData(argsAsArray) as? NSArray {
if let parsedArr:AnyObject = SocketParser.parseData(argsAsArray) {
var returnArr = [AnyObject](count: parsedArr.count, repeatedValue: 0)
for i in 0..<parsedArr.count {
@ -243,8 +232,7 @@ class SocketEvent {
}
return returnArr
}
}
return false
return nil
}
}

View File

@ -190,7 +190,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
self.reconnects = false
self._connecting = false
self._reconnecting = false
self.handleEvent("disconnect", data: message, isInternalMessage: true)
self.handleEvent("disconnect", data: [message], isInternalMessage: true)
}
/**
@ -262,7 +262,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp, wantsAck: ack)
}
self.engine?.send(str, datas: emitDatas)
self.engine?.send(str, withData: emitDatas)
} else {
if ack == nil {
str = SocketEvent.createMessageForEvent(event, withArgs: items, hasBinary: false,
@ -272,7 +272,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
withDatas: 0, toNamespace: self.nsp, wantsAck: ack)
}
self.engine?.send(str)
self.engine?.send(str, withData: nil)
}
}
@ -296,7 +296,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
withAckType: 3, withNsp: self!.nsp!)
}
self?.engine?.send(str)
self?.engine?.send(str, withData: nil)
} else {
if self?.nsp == nil {
str = SocketEvent.createAck(ack, withArgs: items,
@ -306,7 +306,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
withAckType: 6, withNsp: self!.nsp!, withBinary: emitDatas.count)
}
self?.engine?.send(str, datas: emitDatas)
self?.engine?.send(str, withData: emitDatas)
}
}
}
@ -333,7 +333,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
/**
Causes an event to be handled. Only use if you know what you're doing.
*/
public func handleEvent(event:String, data:AnyObject?, isInternalMessage:Bool = false,
public func handleEvent(event:String, data:NSArray?, isInternalMessage:Bool = false,
wantsAck ack:Int? = nil, withAckType ackType:Int = 3) {
// println("Should do event: \(event) with data: \(data)")
if !self.connected && !isInternalMessage {
@ -349,29 +349,11 @@ public class SocketIOClient: NSObject, SocketEngineClient {
for handler in self.handlers {
if handler.event == event {
if data is NSArray {
if ack != nil {
handler.executeCallback(data as? NSArray, withAck: ack!,
handler.executeCallback(data, withAck: ack!,
withAckType: ackType, withSocket: self)
} else {
handler.executeCallback(data as? NSArray)
}
} else {
// Trying to do a ternary expression in the executeCallback method
// seemed to crash Swift
var dataArr:NSArray? = nil
if let data:AnyObject = data {
dataArr = [data]
}
if ack != nil {
handler.executeCallback(dataArr, withAck: ack!,
withAckType: ackType, withSocket: self)
} else {
handler.executeCallback(dataArr)
}
handler.executeCallback(data)
}
}
}
@ -380,7 +362,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
// Should be removed and moved to SocketEngine
func joinNamespace() {
if self.nsp != nil {
self.engine?.send("0/\(self.nsp!)")
self.engine?.send("0/\(self.nsp!)", withData: nil)
}
}
@ -415,10 +397,10 @@ public class SocketIOClient: NSObject, SocketEngineClient {
}
// Something happened while polling
public func pollingDidFail(err:NSError?) {
public func pollingDidFail(err:NSError) {
if !self.reconnecting {
self._connected = false
self.handleEvent("reconnect", data: err?.localizedDescription, isInternalMessage: true)
self.handleEvent("reconnect", data: [err.localizedDescription], isInternalMessage: true)
self.tryReconnect()
}
}
@ -452,7 +434,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
}
}
self.handleEvent("reconnectAttempt", data: self.reconnectAttempts - self.currentReconnectAttempt,
self.handleEvent("reconnectAttempt", data: [self.reconnectAttempts - self.currentReconnectAttempt],
isInternalMessage: true)
self.currentReconnectAttempt++
@ -470,7 +452,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
if self.closed || !self.reconnects {
self.didForceClose(message: "WebSocket closed")
} else {
self.handleEvent("reconnect", data: reason, isInternalMessage: true)
self.handleEvent("reconnect", data: [reason], isInternalMessage: true)
self.tryReconnect()
}
}
@ -479,11 +461,11 @@ public class SocketIOClient: NSObject, SocketEngineClient {
public func webSocketDidFailWithError(error:NSError) {
self._connected = false
self._connecting = false
self.handleEvent("error", data: error.localizedDescription, isInternalMessage: true)
self.handleEvent("error", data: [error.localizedDescription], isInternalMessage: true)
if self.closed || !self.reconnects {
self.didForceClose(message: "WebSocket closed with an error \(error)")
} else if !self.reconnecting {
self.handleEvent("reconnect", data: error.localizedDescription, isInternalMessage: true)
self.handleEvent("reconnect", data: [error.localizedDescription], isInternalMessage: true)
self.tryReconnect()
}
}

View File

@ -72,13 +72,9 @@ class SocketParser {
}
// Parses data for events
class func parseData(data:String?) -> AnyObject? {
if data == nil {
return nil
}
class func parseData(data:String) -> AnyObject? {
var err:NSError?
let stringData = data!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let parsed:AnyObject? = NSJSONSerialization.JSONObjectWithData(stringData!,
options: NSJSONReadingOptions.AllowFragments, error: &err)
@ -192,34 +188,6 @@ class SocketParser {
// NSLog(stringMessage)
// Check for successful namepsace connect
if socket.nsp != nil {
if stringMessage == "0/\(socket.nsp!)" {
socket.didConnect()
return
}
}
if stringMessage == "0" {
if socket.nsp != nil {
// Join namespace
socket.joinNamespace()
return
} else {
socket.didConnect()
return
}
} else if stringMessage == "1" {
socket.didForceClose(message: "Got disconnect")
return
}
if stringMessage.hasPrefix("5") || stringMessage.hasPrefix("6") {
// Check for message with binary placeholders
self.parseBinaryMessage(stringMessage, socket: socket)
return
}
let type = stringMessage.removeAtIndex(stringMessage.startIndex)
if type == "2" {
@ -234,13 +202,12 @@ class SocketParser {
return
}
if let parsed:AnyObject = self.parseData(data) {
if let parsed:AnyObject? = self.parseData(data) {
if ackNum == "" {
socket.handleEvent(event, data: parsed)
socket.handleEvent(event, data: parsed as? NSArray)
} else {
socket.currentAck = ackNum.toInt()!
socket.handleEvent(event, data: parsed, isInternalMessage: false,
wantsAck: ackNum.toInt(), withAckType: 3)
socket.handleEvent(event, data: parsed as? NSArray, wantsAck: ackNum.toInt(), withAckType: 3)
}
}
}
@ -257,9 +224,28 @@ class SocketParser {
socket.handleAck(ackNum.toInt()!, data: ackData)
}
} else if type == "4" {
NSLog("Got Error packet")
} else if type == "5" {
self.parseBinaryMessage(stringMessage, socket: socket, type: "5")
} else if type == "6" {
self.parseBinaryMessage(stringMessage, socket: socket, type: "6")
} else if type == "0" {
if socket.nsp != nil {
// Join namespace
socket.joinNamespace()
return
} else if socket.nsp != nil && stringMessage == "/\(socket.nsp!)" {
socket.didConnect()
return
} else {
socket.didConnect()
return
}
} else if type == "1" {
socket.didForceClose(message: "Got disconnect")
} else {
NSLog("Error in parsing message: %s", stringMessage)
return
}
}
@ -277,10 +263,9 @@ class SocketParser {
if shouldExecute {
let socketEvent = socket.waitingData.removeAtIndex(0)
var event = socketEvent.event
var parsedArgs:AnyObject? = self.parseData(socketEvent.args as? String)
if let args:AnyObject = parsedArgs {
let filledInArgs:AnyObject = socketEvent.fillInPlaceholders(args)
if let args:AnyObject = self.parseData(socketEvent.args as String) {
let filledInArgs = socketEvent.fillInPlaceholders()
if socketEvent.justAck! {
// Should handle ack
@ -296,7 +281,7 @@ class SocketParser {
socket.handleEvent(event, data: filledInArgs)
}
} else {
let filledInArgs:AnyObject = socketEvent.fillInPlaceholders()
let filledInArgs = socketEvent.fillInPlaceholders()
// Should handle ack
if socketEvent.justAck! {
@ -316,13 +301,11 @@ class SocketParser {
}
// Tries to parse a message that contains binary
class func parseBinaryMessage(var message:String, socket:SocketIOClient) {
class func parseBinaryMessage(stringMessage:String, socket:SocketIOClient, type:String) {
// NSLog(message)
let type = message.removeAtIndex(message.startIndex)
if type == "5" {
if let groups = message["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[\"(.*?)\",?(.*)?\\]$",
if let groups = stringMessage["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[\"(.*?)\",?(.*)?\\]$",
NSRegularExpressionOptions.DotMatchesLineSeparators].groups() {
let numberOfPlaceholders = groups[1]
let namespace = groups[3]
@ -350,7 +333,7 @@ class SocketParser {
socket.waitingData.append(mes)
}
} else if type == "6" {
if let groups = message["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[(.*?)?\\]$",
if let groups = stringMessage["^(\\d*)-(\\/(\\w*))?,?(\\d*)?\\[(.*?)?\\]$",
NSRegularExpressionOptions.DotMatchesLineSeparators].groups() {
let numberOfPlaceholders = groups[1]
let namespace = groups[3]
@ -369,7 +352,7 @@ class SocketParser {
socket.waitingData.append(event)
}
} else {
NSLog("Error in parsing binary message: %s", message)
NSLog("Error in parsing binary message: %s", stringMessage)
return
}
}