【问题标题】:How can I call asynchronously a method only when other async method finishes working in Swift?仅当其他异步方法在 Swift 中完成工作时,如何才能异步调用方法?
【发布时间】:2016-04-27 14:41:55
【问题描述】:

我正在为swift 实现socket.io 库。

有一个与连接服务器相关的方法,如下所示:

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

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)
    }
}

如您所见,所有内容都包含在 dispatch_async 中。我想在此方法完成并且我的应用程序连接到服务器后立即发布NSNotification,例如:

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

所以我的问题是 - 我应该如何修改我的 connectToServerWithNickname 方法,以便在一切正常时调用我的 nsnotificationcenter

【问题讨论】:

  • as soon as this method is done and my app connects to the server 这是否意味着它可以在self.engine?.send(str, withData: packet.binary) 行之后完成,或者您是否必须等待服务器响应以确保您在发送通知之前已连接?
  • 我知道有ack 数据可以确认连接成功,所以对我来说,最好有这些信息然后拨打NSNotificationCenter。否则 - 如果那不可能 - 我可以保留第一个选项
  • 您没有套接字侦听器,例如 onEvents,当您收到连接的消息时会触发?
  • @SeanLintern88 我遵循了本教程appcoda.com/socket-io-chat-app,但他们没有提到任何套接字侦听器:|

标签: ios swift socket.io dispatch-async


【解决方案1】:

在您声明您使用的是 socket.IO 之后

当您在连接之前创建套接字实例时,您将拥有

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

然后在这个放置之后

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

编辑:

对于单独的发射,你会保留一个指向你的套接字的指针并使用

     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
    }

所以使用你上面的例子。

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

【讨论】:

  • 这里有没有办法检查完成处理程序?
  • 谢谢!最后一个问题 - 这里的timeoutAfter 是什么?
  • 在调用超时并被视为失败之前的时间量(以秒为单位)。
猜你喜欢
  • 2021-01-27
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2021-02-14
相关资源
最近更新 更多