我使用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)!
})
}
可能是什么问题?
答案 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)!
}
//-------------------------------------------------------
})
}