Я создаю приложение чата на swift4. И я использовал серверную систему, используя python3 + django.
Мой клиент чата может хорошо взаимодействовать с моей серверной системой, кроме как посредством вызова функции ajax в моем событии сокета.
Вот мой код.
func reloadChatData() {
let jsonData = loadChat(_registration_id: RemoshinData.getRegistrationId())
if(jsonData["status"].string! == "success") {
for chat in jsonData["chat"].arrayValue {
if (chat["chat_from"] == "D") {
let chat = ChatEntity(text: chat["chat"].string!, time: "", userType: .You)
chats.append(chat)
}
else {
let chat = ChatEntity(text: chat["chat"].string!, time: "", userType: .I)
chats.append(chat)
}
}
}
tableView.reloadData()
}
func loadChat(_registration_id: String) -> JSON {
let _commonURL = CommmonURL()
var _load_chat_url = _commonURL.SERVER_HOSTNAME + _commonURL.LOAD_CHAT_ENTRY_POINT
_load_chat_url = addParameter(url: _load_chat_url, named: "registration_id", value: _registration_id)
let response = runQuery(_load_chat_url)
let data: Data? = String(describing: response.rawValue).data(using: .utf8)
let responseJson = JSON(data!) as JSON
return responseJson
}
private func runQuery(_ _url: String) -> JSON {
var responseData: JSON = JSON.null
let urlString = _url
var keepAlive = true
Alamofire.request(urlString, method: .get, parameters: nil, encoding: JSONEncoding.default).responseJSON(completionHandler: { response in
responseData = JSON(response.result.value!)
keepAlive = false
print("**") // ********** When I call runQuery from websocket event listener function, the code don't reach this line. **********
})
print(keepAlive)
let runLoop = RunLoop.current
while keepAlive &&
runLoop.run(mode: RunLoopMode.defaultRunLoopMode, before: Date(timeIntervalSinceNow: 0.1)) {
}
return responseData
}
Я могу успешно вызвать функцию reloadChatData из viewController.
Но следующий вызов не работает.
override func viewDidLoad() {
manager = SocketManager(socketURL: URL(string: SocketURL)!, config: [.log(true), .compress])
socketIOClient = manager.defaultSocket
socketIOClient.on(clientEvent: .connect) {data, ack in
print(data)
// Connect Event is fired...
let data : Dictionary<String, String> = ["value": RemoshinData.getRegistrationId()]
self.socketIOClient.emit("join_room", data)
print("socket connected")
}
socketIOClient.on(clientEvent: .error) { (data, eck) in
print(data)
print("socket error")
}
socketIOClient.on(clientEvent: .disconnect) { (data, eck) in
print(data)
print("socket disconnect")
}
socketIOClient.on(clientEvent: SocketClientEvent.reconnect) { (data, eck) in
print(data)
print("socket reconnect")
}
socketIOClient.on("server_to_client") { data, emitter in
print("Get Message from Doctor...")
// ********** FAILED **********
self.reloadChatData()
}
socketIOClient.connect()
}
Я получил сообщение "Получить сообщение от доктора ..." на консоли. Но функция reloadChatData, похоже, никогда не заканчивается.
Я знаю, что переменная keepAlive в функции runQuery никогда не меняет false, поэтому пока цикл не может закончиться.
Как я могу решить проблему? Пожалуйста, дайте мне совет.