2017-05-12 184 views
-1

我使用RabbitMQ和CloudAMQP服務器在2個應用程序之間發送消息。iOS消費者的長時間延遲

它需要小於一秒在兩個.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)! 
     }) 
    } 

可能是什麼問題?

回答

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)! 
     } 
     //------------------------------------------------------- 
    }) 
} 
+0

我剛加了代碼。我使用2個簡單的方法:send()和receive()。 我從教程中得到了這段代碼。 – Kirill

+0

請參閱編輯我的答案。 –

+0

謝謝!它現在有效。 – Kirill