Не нашел ни одного актуального гайда по работе с websocket в Xcode, вот мой опыт, надеюсь какому-то новичку поможет, и он не потратит столько времени в поисках как я.
Для подключения по websocket мы будем использовать SocketIOClientSwift
Скачать можно тут github.com/socketio/socket.io-client-swift
Установка там тоже в принципе описывается, но для тех кто совсем в танке расскажу, что есть простой способ, просто добавьте файлы из папки 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()
Надеюсь гайд будет полезен, если есть вопросы или Вы знаете как сделать лучше/быстрее/красивее пишите.
ссылка на оригинал статьи https://habrahabr.ru/post/277635/
Добавить комментарий