Отримуємо дані по 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()

Сподіваюся гайд буде корисний, якщо є питання або ви знаєте, як зробити краще/швидше/красивіше пишіть.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.