2017-04-18 52 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。