быстрый вызов API в событии websocket - PullRequest
0 голосов
/ 05 мая 2018

Я создаю приложение чата на 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, поэтому пока цикл не может закончиться. Как я могу решить проблему? Пожалуйста, дайте мне совет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...