我正在尝试使用API创建一个简单的消息传递应用。现在,我有一个线程,每秒检查一个请求,看看消息的数量是否已经改变,但这会导致很多麻烦,RAM不断上升,由于请求数量很大,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,所以我非常感谢你对此事的一些建议,谢谢!
答案 0 :(得分:0)
在评论中,您提供详细说明,表示您正在实施信使。为此目的,简单的HTTP请求不是合适的方法。相反,您想要引入所谓的套接字连接。我敢于引用another relevant thread:
它被称为套接字连接,一眼就看起来像一个频道,在服务器端托管,任何客户端(设备)都可以加入这个频道(两个或更多,无论你想要什么)。如果设备向服务器发送消息,它应该向所有其他参与者广播消息(它甚至可以向发送者本身广播消息,但是有一些元信息,所以我们可以解除我们自己的消息并忽略它们。)
因此,首先您需要建立套接字连接的服务器,然后您可以实现任何已有的解决方案(例如,适用于iOS的https://github.com/daltoniam/Starscream)。此外,您可能需要查看AWS https://aws.amazon.com,因为它具有开箱即用的服务器端套接字连接服务以及Android和iOS平台所需的SDK。