Получаем данные по 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()