Получаем данные по websocket используя swift и заполняем UITableView (сервер node.js)

Не нашел ни одного актуального гайда по работе с websocket в Xcode, вот мой опыт, надеюсь какому-то новичку поможет, и он не потратит столько времени в поисках как я.

Для подключения по websocket мы будем использовать SocketIOClientSwift

Скачать можно тут.

Установка там тоже в принципе описывается, но для тех кто совсем в танке расскажу, что есть простой способ, просто добавьте файлы из папки source в свой проект.

В нашем примере мы будем получать тикеты из системы технической поддержки которая работает на node.js
Создаем массив наших тикетов (пока что пустой):

 var arrayOfTickets:[String] = []


Можно сделать получение данных по кнопке или при загрузке, в нашем примере при загрузке.

    override func viewDidLoad() {
        super.viewDidLoad()

            let hostUrl = NSURL(string:"http://IP_или_домен:ПОРТ")! //тут указываем адрес подключения
            let tokenSDK = "ТОКЕН ЕСЛИ ЕСТЬ" //тут токен если есть
            let socket = SocketIOClient(socketURL: hostUrl, options: ["log": false,
            "reconnects": true,
            "reconnectAttempts": 1,
            "reconnectWait": 1,
            "connectParams": ["token":tokenSDK]]) // тут задаем параметры передачи данных
        
            socket.on("connect") {data,ack in
            
            let hejka = [""] // тут параметр (если есть)
            let paginav = [""] // тут параметр 2 (если есть)
            
            socket.emitWithAck("ВАШЕ_СОБЫТИЕ", "", hejka, paginav)(timeoutAfter: 0) // указываем событие которое генерируем
                {data in
                
                let dataTickets = data[1]["result"] as! NSArray // парсим json который пришел
                let howMuchTickets = dataTickets.valueForKey("name")
                
                
                for (var i=0; i < howMuchTickets.count; i++){
                    let ticketName = dataTickets[i].valueForKey("name") as? String
                    self.arrayOfTickets.append(ticketName!) // заполняем массив тикетов
                                   }

             }
        }
        
        socket.connect()


Считаем сколько нам нужно сгенерировать ячеек в таблице:

 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return arrayOfTickets.count
    }


Выводим данные (у нас в примере кастомные ячейки, как их сделать не суть моего поста, но если есть вопросы — пишите):

   override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // dequeue the cell from our storyboard
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomTableViewCell
        
        // if the cell has a text label, set it to the model that is corresponding to the row in array
        cell.ticketName?.text = arrayOfTickets[indexPath.row]
        
        // return cell so that Table View knows what to draw in each row
        return cell
    }


Теперь для самых внимательных, как мы знаем запрос идет асинхронный, и при выполнении это кода, у нас ничего не появится.

Для того чтобы появилось нам нужно вызвать функцию tableview, и сказать ей чтобы перезагрузила данные, то есть добавим одну строку.

 override func viewDidLoad() {
        super.viewDidLoad()

            let hostUrl = NSURL(string:"http://IP_или_домен:ПОРТ")! //тут указываем адрес подключения
            let tokenSDK = "ТОКЕН ЕСЛИ ЕСТЬ" //тут токен если есть
            let socket = SocketIOClient(socketURL: hostUrl, options: ["log": false,
            "reconnects": true,
            "reconnectAttempts": 1,
            "reconnectWait": 1,
            "connectParams": ["token":tokenSDK]]) // тут задаем параметры передачи данных
        
            socket.on("connect") {data,ack in
            
            let hejka = [""] // тут параметр (если есть)
            let paginav = [""] // тут параметр 2 (если есть)
            
            socket.emitWithAck("ВАШЕ_СОБЫТИЕ", "", hejka, paginav)(timeoutAfter: 0) // указываем событие которое генерируем
                {data in
                
                let dataTickets = data[1]["result"] as! NSArray
                let howMuchTickets = dataTickets.valueForKey("name")
                
                
                for (var i=0; i < howMuchTickets.count; i++){
                    let ticketName = dataTickets[i].valueForKey("name") as? String
                    self.arrayOfTickets.append(ticketName!) // // заполняем массив тикетов
                   self.tableView.reloadData()  // ВОТ ЭТА СТРОКА
                 }

             }
        }
        
        socket.connect()


Надеюсь гайд будет полезен, если есть вопросы или вы знаете как сделать лучше/быстрее/красивее пишите.

© Habrahabr.ru