Merge pull request #1119 from vonox7/completion-handler-nil

Don’t create empty closures when we don’t need them
This commit is contained in:
Erik Little 2018-11-07 09:38:22 -05:00 committed by GitHub
commit ec86a19fc6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 29 additions and 56 deletions

View File

@ -204,25 +204,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
leaveNamespace() leaveNamespace()
} }
/// Send an event to the server, with optional data items. /// Send an event to the server, with optional data items and optional write completion handler.
///
/// If an error occurs trying to transform `items` into their socket representation, a `SocketClientEvent.error`
/// will be emitted. The structure of the error data is `[eventName, items, theError]`
///
/// - parameter event: The event to send.
/// - parameter items: The items to send with this event. May be left out.
open func emit(_ event: String, _ items: SocketData...) {
do {
try emit(event, with: items.map({ try $0.socketRepresentation() }))
} catch {
DefaultSocketLogger.Logger.error("Error creating socketRepresentation for emit: \(event), \(items)",
type: logType)
handleClientEvent(.error, data: [event, items, error])
}
}
/// Send an event to the server, with optional data items and write completion handler.
/// ///
/// If an error occurs trying to transform `items` into their socket representation, a `SocketClientEvent.error` /// If an error occurs trying to transform `items` into their socket representation, a `SocketClientEvent.error`
/// will be emitted. The structure of the error data is `[eventName, items, theError]` /// will be emitted. The structure of the error data is `[eventName, items, theError]`
@ -230,7 +212,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
/// - parameter event: The event to send. /// - parameter event: The event to send.
/// - parameter items: The items to send with this event. May be left out. /// - parameter items: The items to send with this event. May be left out.
/// - parameter completion: Callback called on transport write completion. /// - parameter completion: Callback called on transport write completion.
open func emit(_ event: String, _ items: SocketData..., completion: @escaping () -> ()) { open func emit(_ event: String, _ items: SocketData..., completion: (() -> ())? = nil) {
do { do {
try emit(event, with: items.map({ try $0.socketRepresentation() }), completion: completion) try emit(event, with: items.map({ try $0.socketRepresentation() }), completion: completion)
} catch { } catch {
@ -256,7 +238,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
/// - parameter items: The items to send with this event. Send an empty array to send no data. /// - parameter items: The items to send with this event. Send an empty array to send no data.
/// - parameter completion: Callback called on transport write completion. /// - parameter completion: Callback called on transport write completion.
@objc @objc
open func emit(_ event: String, with items: [Any], completion: @escaping () -> ()) { open func emit(_ event: String, with items: [Any], completion: (() -> ())? = nil) {
emit([event] + items, completion: completion) emit([event] + items, completion: completion)
} }
@ -317,18 +299,18 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
ack: Int? = nil, ack: Int? = nil,
binary: Bool = true, binary: Bool = true,
isAck: Bool = false, isAck: Bool = false,
completion: @escaping () -> () = {} completion: (() -> ())? = nil
) { ) {
// wrap the completion handler so it always runs async via handlerQueue // wrap the completion handler so it always runs async via handlerQueue
let wrappedCompletion = {[weak self] in let wrappedCompletion: (() -> ())? = (completion == nil) ? nil : {[weak self] in
guard let this = self else { return } guard let this = self else { return }
this.manager?.handleQueue.async { this.manager?.handleQueue.async {
completion() completion!()
} }
} }
guard status == .connected else { guard status == .connected else {
wrappedCompletion() wrappedCompletion?()
handleClientEvent(.error, data: ["Tried emitting when not connected"]) handleClientEvent(.error, data: ["Tried emitting when not connected"])
return return
} }

View File

@ -92,16 +92,7 @@ public protocol SocketIOClientSpec : AnyObject {
/// Disconnects the socket. /// Disconnects the socket.
func disconnect() func disconnect()
/// Send an event to the server, with optional data items. /// Send an event to the server, with optional data items and optional write completion handler.
///
/// If an error occurs trying to transform `items` into their socket representation, a `SocketClientEvent.error`
/// will be emitted. The structure of the error data is `[eventName, items, theError]`
///
/// - parameter event: The event to send.
/// - parameter items: The items to send with this event. May be left out.
func emit(_ event: String, _ items: SocketData...)
/// Send an event to the server, with optional data items and write completion handler.
/// ///
/// If an error occurs trying to transform `items` into their socket representation, a `SocketClientEvent.error` /// If an error occurs trying to transform `items` into their socket representation, a `SocketClientEvent.error`
/// will be emitted. The structure of the error data is `[eventName, items, theError]` /// will be emitted. The structure of the error data is `[eventName, items, theError]`
@ -109,7 +100,7 @@ public protocol SocketIOClientSpec : AnyObject {
/// - parameter event: The event to send. /// - parameter event: The event to send.
/// - parameter items: The items to send with this event. May be left out. /// - parameter items: The items to send with this event. May be left out.
/// - parameter completion: Callback called on transport write completion. /// - parameter completion: Callback called on transport write completion.
func emit(_ event: String, _ items: SocketData..., completion: @escaping () -> ()) func emit(_ event: String, _ items: SocketData..., completion: (() -> ())?)
/// Call when you wish to tell the server that you've received the event for `ack`. /// Call when you wish to tell the server that you've received the event for `ack`.
/// ///

View File

@ -346,7 +346,7 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
if polling { if polling {
disconnectPolling(reason: reason) disconnectPolling(reason: reason)
} else { } else {
sendWebSocketMessage("", withType: .close, withData: [], completion: {}) sendWebSocketMessage("", withType: .close, withData: [], completion: nil)
closeOutEngine(reason: reason) closeOutEngine(reason: reason)
} }
} }
@ -372,7 +372,7 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
DefaultSocketLogger.Logger.log("Switching to WebSockets", type: SocketEngine.logType) DefaultSocketLogger.Logger.log("Switching to WebSockets", type: SocketEngine.logType)
sendWebSocketMessage("", withType: .upgrade, withData: [], completion: {}) sendWebSocketMessage("", withType: .upgrade, withData: [], completion: nil)
polling = false polling = false
fastUpgrade = false fastUpgrade = false
probing = false probing = false
@ -390,7 +390,7 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
DefaultSocketLogger.Logger.log("Flushing probe wait", type: SocketEngine.logType) DefaultSocketLogger.Logger.log("Flushing probe wait", type: SocketEngine.logType)
for waiter in probeWait { for waiter in probeWait {
write(waiter.msg, withType: waiter.type, withData: waiter.data, completion:waiter.completion) write(waiter.msg, withType: waiter.type, withData: waiter.data, completion: waiter.completion)
} }
probeWait.removeAll(keepingCapacity: false) probeWait.removeAll(keepingCapacity: false)
@ -550,7 +550,7 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
} }
pongsMissed += 1 pongsMissed += 1
write("", withType: .ping, withData: [], completion: {}) write("", withType: .ping, withData: [], completion: nil)
engineQueue.asyncAfter(deadline: .now() + .milliseconds(pingInterval)) {[weak self, id = self.sid] in engineQueue.asyncAfter(deadline: .now() + .milliseconds(pingInterval)) {[weak self, id = self.sid] in
// Make sure not to ping old connections // Make sure not to ping old connections
@ -606,7 +606,7 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
DefaultSocketLogger.Logger.log("Upgrading transport to WebSockets", type: SocketEngine.logType) DefaultSocketLogger.Logger.log("Upgrading transport to WebSockets", type: SocketEngine.logType)
fastUpgrade = true fastUpgrade = true
sendPollMessage("", withType: .noop, withData: [], completion: {}) sendPollMessage("", withType: .noop, withData: [], completion: nil)
// After this point, we should not send anymore polling messages // After this point, we should not send anymore polling messages
} }
} }
@ -617,10 +617,10 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
/// - parameter type: The type of this message. /// - parameter type: The type of this message.
/// - parameter data: Any data that this message has. /// - parameter data: Any data that this message has.
/// - parameter completion: Callback called on transport write completion. /// - parameter completion: Callback called on transport write completion.
open func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [Data], completion: @escaping () -> ()) { open func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [Data], completion: (() -> ())? = nil) {
engineQueue.async { engineQueue.async {
guard self.connected else { guard self.connected else {
completion() completion?()
return return
} }
guard !self.probing else { guard !self.probing else {

View File

@ -65,7 +65,7 @@ public protocol SocketEnginePollable : SocketEngineSpec {
/// - parameter message: The message to send. /// - parameter message: The message to send.
/// - parameter withType: The type of message to send. /// - parameter withType: The type of message to send.
/// - parameter withData: The data associated with this message. /// - parameter withData: The data associated with this message.
func sendPollMessage(_ message: String, withType type: SocketEnginePacketType, withData datas: [Data], completion: @escaping () -> ()) func sendPollMessage(_ message: String, withType type: SocketEnginePacketType, withData datas: [Data], completion: (() -> ())?)
/// Call to stop polling and invalidate the URLSession. /// Call to stop polling and invalidate the URLSession.
func stopPolling() func stopPolling()
@ -75,7 +75,7 @@ public protocol SocketEnginePollable : SocketEngineSpec {
extension SocketEnginePollable { extension SocketEnginePollable {
func createRequestForPostWithPostWait() -> URLRequest { func createRequestForPostWithPostWait() -> URLRequest {
defer { defer {
for packet in postWait { packet.completion() } for packet in postWait { packet.completion?() }
postWait.removeAll(keepingCapacity: true) postWait.removeAll(keepingCapacity: true)
} }
@ -219,7 +219,7 @@ extension SocketEnginePollable {
/// - parameter withType: The type of message to send. /// - parameter withType: The type of message to send.
/// - parameter withData: The data associated with this message. /// - parameter withData: The data associated with this message.
/// - parameter completion: Callback called on transport write completion. /// - parameter completion: Callback called on transport write completion.
public func sendPollMessage(_ message: String, withType type: SocketEnginePacketType, withData datas: [Data], completion: @escaping () -> ()) { public func sendPollMessage(_ message: String, withType type: SocketEnginePacketType, withData datas: [Data], completion: (() -> ())? = nil) {
DefaultSocketLogger.Logger.log("Sending poll: \(message) as type: \(type.rawValue)", type: "SocketEnginePolling") DefaultSocketLogger.Logger.log("Sending poll: \(message) as type: \(type.rawValue)", type: "SocketEnginePolling")
postWait.append((String(type.rawValue) + message, completion)) postWait.append((String(type.rawValue) + message, completion))

View File

@ -138,7 +138,7 @@ import Starscream
/// - parameter type: The type of this message. /// - parameter type: The type of this message.
/// - parameter data: Any data that this message has. /// - parameter data: Any data that this message has.
/// - parameter completion: Callback called on transport write completion. /// - parameter completion: Callback called on transport write completion.
func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [Data], completion: @escaping () -> ()) func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [Data], completion: (() -> ())?)
} }
extension SocketEngineSpec { extension SocketEngineSpec {
@ -180,7 +180,7 @@ extension SocketEngineSpec {
} }
/// Send an engine message (4) /// Send an engine message (4)
func send(_ msg: String, withData datas: [Data], completion: @escaping () -> () = {}) { func send(_ msg: String, withData datas: [Data], completion: (() -> ())? = nil) {
write(msg, withType: .message, withData: datas, completion: completion) write(msg, withType: .message, withData: datas, completion: completion)
} }
} }

View File

@ -41,14 +41,14 @@ public protocol SocketEngineWebsocket : SocketEngineSpec {
func sendWebSocketMessage(_ str: String, func sendWebSocketMessage(_ str: String,
withType type: SocketEnginePacketType, withType type: SocketEnginePacketType,
withData datas: [Data], withData datas: [Data],
completion: @escaping () -> ()) completion: (() -> ())?)
} }
// WebSocket methods // WebSocket methods
extension SocketEngineWebsocket { extension SocketEngineWebsocket {
func probeWebSocket() { func probeWebSocket() {
if ws?.isConnected ?? false { if ws?.isConnected ?? false {
sendWebSocketMessage("probe", withType: .ping, withData: [], completion: {}) sendWebSocketMessage("probe", withType: .ping, withData: [], completion: nil)
} }
} }
@ -63,7 +63,7 @@ extension SocketEngineWebsocket {
public func sendWebSocketMessage(_ str: String, public func sendWebSocketMessage(_ str: String,
withType type: SocketEnginePacketType, withType type: SocketEnginePacketType,
withData datas: [Data], withData datas: [Data],
completion: @escaping () -> () completion: (() -> ())?
) { ) {
DefaultSocketLogger.Logger.log("Sending ws: \(str) as type: \(type.rawValue)", type: "SocketEngineWebSocket") DefaultSocketLogger.Logger.log("Sending ws: \(str) as type: \(type.rawValue)", type: "SocketEngineWebSocket")

View File

@ -286,7 +286,7 @@ open class SocketManager : NSObject, SocketManagerSpec, SocketParsable, SocketDa
/// - parameter items: The data to send with this event. /// - parameter items: The data to send with this event.
open func emitAll(_ event: String, withItems items: [Any]) { open func emitAll(_ event: String, withItems items: [Any]) {
forAll {socket in forAll {socket in
socket.emit(event, with: items, completion: {}) socket.emit(event, with: items, completion: nil)
} }
} }

View File

@ -74,10 +74,10 @@ public typealias AckCallback = ([Any]) -> ()
public typealias NormalCallback = ([Any], SocketAckEmitter) -> () public typealias NormalCallback = ([Any], SocketAckEmitter) -> ()
/// A typealias for a queued POST /// A typealias for a queued POST
public typealias Post = (msg: String, completion: (() -> ())) public typealias Post = (msg: String, completion: (() -> ())?)
typealias JSON = [String: Any] typealias JSON = [String: Any]
typealias Probe = (msg: String, type: SocketEnginePacketType, data: [Data], completion: (() -> ())) typealias Probe = (msg: String, type: SocketEnginePacketType, data: [Data], completion: (() -> ())?)
typealias ProbeWaitQueue = [Probe] typealias ProbeWaitQueue = [Probe]
enum Either<E, V> { enum Either<E, V> {

View File

@ -198,7 +198,7 @@ public class TestSocket : SocketIOClient {
super.didDisconnect(reason: reason) super.didDisconnect(reason: reason)
} }
public override func emit(_ event: String, with items: [Any], completion: @escaping () -> ()) { public override func emit(_ event: String, with items: [Any], completion: (() -> ())?) {
expectations[ManagerExpectation.emitAllEventCalled]?.fulfill() expectations[ManagerExpectation.emitAllEventCalled]?.fulfill()
expectations[ManagerExpectation.emitAllEventCalled] = nil expectations[ManagerExpectation.emitAllEventCalled] = nil

View File

@ -511,5 +511,5 @@ class TestEngine : SocketEngineSpec {
func flushWaitingForPostToWebSocket() { } func flushWaitingForPostToWebSocket() { }
func parseEngineData(_ data: Data) { } func parseEngineData(_ data: Data) { }
func parseEngineMessage(_ message: String) { } func parseEngineMessage(_ message: String) { }
func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [Data], completion: @escaping () -> ()) { } func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [Data], completion: (() -> ())?) { }
} }