2016-04-27 1 views
0

Je suis implémentant la bibliothèque socket.io pour swift.Comment puis-je appeler de manière asynchrone une méthode uniquement lorsque d'autres méthodes async ont fini de fonctionner dans Swift?

Il existe une méthode liée à la connexion au serveur qui se présente comme suit:

func connectToServerWithNickname(nickname: String) { 
     socket.emit("connectUser", nickname) 
} 

Les appels socket.emit:

private func _emit(data: [AnyObject], ack: Int? = nil) { 
    dispatch_async(emitQueue) { 
     guard self.status == .Connected else { 
      self.handleEvent("error", data: ["Tried emitting when not connected"], isInternalMessage: true) 
      return 
     } 

     let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: self.nsp, ack: false) 
     let str = packet.packetString 

     DefaultSocketLogger.Logger.log("Emitting: %@", type: self.logType, args: str) 

     self.engine?.send(str, withData: packet.binary) 
    } 
} 

comme vous pouvez le voir tout est emballé dans dispatch_async. Je voudrais poster un NSNotification dès que cette méthode est fait et mon application se connecte au serveur, STH comme:

NSNotificationCenter.defaultCenter().postNotificationName(setConnectionStatus, object: self) 

Donc, ma question est - comment dois-je modifier ma méthode connectToServerWithNickname pour qu'il appelle mon nsnotificationcenter quand tout va bien?

+0

'dès que cette méthode est fait et mon application se connecte au server' Est-ce que cela signifie qu'il pourrait se faire après la' self.engine .send (str, withData: packet.binary)? 'Ligne, ou devrez-vous attendre la réponse du serveur pour être sûr que vous êtes connecté avant d'envoyer la notification? – Moritz

+0

Je sais qu'il y a les données 'ack' qui confirment que la connexion a été réussie, donc pour moi, il serait parfait d'avoir cette information et d'appeler le' NSNotificationCenter'. Sinon - si ce n'est pas possible - je peux rester avec la première option bien que – user3766930

+0

n'avez-vous pas d'écouteurs de socket, comme onEvents, qui se déclencheraient lorsque vous recevriez un message connecté? – SeanLintern88

Répondre

2

Une fois que vous avez dit que vous utilisez socket.IO

Lorsque vous faites votre instance de la prise avant de vous connecter, vous aurez

var socket: SocketIOClient = SocketIOClient(socketURL: NSURL(string: "http://192.168.1.XXX:3000")!) 

puis après cette mise

socket.on("connect") { (data, ack) -> Void in 
     // This will be fired once your socket connects. 
    } 

EDIT :

Pour les émetteurs individuels, vous conservez un pointeur vers votre cket and use

 let json = ["things_i_need_to_send" : stuff] 

    socket.emitWithAck(Place_i_need_to_send_to, json)(timeoutAfter: 3) { data in 
     //This is called on completion 
    } 

Donc en utilisant votre exemple ci-dessus.

socket.emitWithAck(connectUser, nickname)(timeoutAfter: 3) { data in 
     //This is called on completion 
    } 
+0

est-il un moyen de vérifier le gestionnaire de complétion ici? – user3766930

+0

merci! une dernière question - qu'est-ce que 'timeoutAfter' ici? – user3766930

+0

la durée en secondes avant que l'appel expire et soit considérée comme ayant échoué. – SeanLintern88