2017-04-18 53 views
3

我試圖使用API​​製作簡單的消息應用程序。現在,我有一個線程每秒檢查一次請求,看看消息的數量是否發生了變化,但是這會帶來很多麻煩,RAM會不斷增加,並且由於請求的數量太大,API變得無法響應。目前我的代碼看起來是這樣的:如何讀取HTTP請求,而不會使用Swift 3氾濫我的API

var request = URLRequest(url: URL(string: "URL")!) 
let session = URLSession.shared 

public func thread() 
     { 
      DispatchQueue.global(qos: .background).async { 
       while(true) 
       { 
        self.request.httpMethod = "GET" 
        self.session.dataTask(with: self.request) {data, response, err in 
         let json = try! JSONSerialization.jsonObject(with: data!, options: []) as? [String: Any] 
         let data = json?["data"] as? [[String: Any]] 
         if((data?.count)! > self.nbMessages) 
         { 
          self.messages.removeAll() 
          for message in data! { 
           let text = message["message_body"] as? String 
           let creator = message["creator_id"] as? Int 
           self.messages.append([text!, String(creator!)]) 
          } 
          DispatchQueue.main.async { 
           self.nbMessages = (data?.count)! 
           self.TableView.reloadData() 
           let scrollPoint = CGPoint(x: 0, y: self.TableView.contentSize.height - self.TableView.frame.size.height) 
           self.TableView.setContentOffset(scrollPoint, animated: false) 
          } 
         } 
         }.resume() 
        usleep(2000) 
       } 
      } 
     } 

這工作得很好,我可以發送消息和查看發送給我(一個體面的延遲)的消息,但我與每2秒請求邏輯的路要走我承認這一點。我仍然在學習Swift,因此我非常感謝關於此事的一些建議,謝謝!

+1

我認爲這是當你應該使用推送通知... – Honey

+0

以什麼方式?我的API爲我提供了2個端點:getmessages和sendmessage –

+0

我同意@Honey,而不是無休止地運行該函數來觀察收到的消息,向後端添加APNS功能,以便在新消息可用時通知您的應用程序,應用程序可以運行一個函數來提取新消息。 – janusbalatbat

回答

0

在評論中,您提供了詳細說明,說您正在實施一個信使。爲此目的,簡單的HTTP請求不是合適的方法。相反,你想引入所謂的套接字連接。我敢從another relevant thread引用自己:

這就是所謂的插座連接,它看起來像一個通道,即在服務器端的主機一目瞭然,任何客戶機(設備)可以加入此頻道(兩個或兩個以上,任何你想要的)。如果設備向服務器發送消息,它應該向所有其他參與者廣播消息(它甚至可以向發送者本身廣播消息,但是具有一些元信息,以便我們可以消除我們自己的消息並忽略它們)。因此,首先您需要建立套接字連接的服務器,然後您可以實施任何現有的解決方案(例如,適用於iOS的https://github.com/daltoniam/Starscream)。另外,您可能想看看AWS https://aws.amazon.com,因爲它具有服務器端開箱即用的套接字連接服務以及適用於Android和iOS平臺的所需SDK。