iOS消费者的长时间延迟

时间:2017-05-12 10:51:31

标签: c# ios .net swift rabbitmq

我使用RabbitMQ和CloudAMQP服务器在两个应用程序之间发送消息。

在两个.Net控制台应用程序之间或从iOS应用程序到.Net控制台应用程序之间发送消息需要不到一秒

但如果我将.Net控制台应用程序的消息发送到iOS应用程序,则需要 7-10秒

override func viewDidLoad() {
        super.viewDidLoad()
        self.send()
        //self.receive()        
    }
    func send() {        

        let delegate = RMQConnectionDelegateLogger()
        let conn = RMQConnection(uri: "...", delegate: delegate)

        conn.start()
        let ch = conn.createChannel()
        let q = ch.queue("hello")
        ch.defaultExchange().publish("Hello World!".data(using: .utf8), routingKey: q.name)
        self.lblText.text = "Sent 'Hello World!'"
        conn.close()
    }

    func receive() {        
        let delegate = RMQConnectionDelegateLogger()
        let conn = RMQConnection(uri: "...", delegate: delegate)

        conn.start()
        let ch = conn.createChannel()
        let q = ch.queue("hello")
        q.subscribe({(_ message: RMQMessage) -> Void in           
            self.lblText.text = String(data: message.body, encoding: String.Encoding.utf8)!
        })
    }

可能是什么问题?

1 个答案:

答案 0 :(得分:2)

可能是从后台线程不当使用UI调用,但是无法从外部判断。

您的接收功能正在拨打subscribe,需要一个完成处理程序。如果该完成处理程序在后台线程上运行,那么您将需要将完成处理程序内的任何UI调用包装到对主线程的调用。试试这个改变:

func receive() {        
    let delegate = RMQConnectionDelegateLogger()
    let conn = RMQConnection(uri: "...", delegate: delegate)

    conn.start()
    let ch = conn.createChannel()
    let q = ch.queue("hello")
    q.subscribe({(_ message: RMQMessage) -> Void in
        //-------------------------------------------------------
        //Wrap UIKit code in a call to DispatchQueue.main.async()
        DispatchQueue.main.async {           
          self.lblText.text = String(data: message.body, encoding: String.Encoding.utf8)!
        }
        //-------------------------------------------------------
    })
}