Просьба помочь новичку. TabBar + ViewController

alamofire
xcode
tableview
swift

#1

Всем привет! Прошу помощи. Имеется три ViewController-а(+таблица/картинки/кнопки и тд). Переход осуществляемся через tabbar. Данные для заполнения получаю с сервера (через Alamofire). Для каждого контроллера свой запрос. Возник такой вопрос: каким образом выполнить синхронизацию между тремя контроллерами? т.е. на пример на одном контролере я нажимаю кнопку “лайк”, соответсвенно кнопка меняет цвет и счетчик лайков увеличивается, но при переходе на другие контроллеры для данной ячейки значения стоят старые (что не удивительно). Пробовал через viewWillApper, но как-то не помогло. По идее при переходе нужно полностью обновлять/сбрасывать контролер, чтобы повторно шел запрос на сервер и обрисовывались ячейки, но как это сделать ума не приложу. Или можно как-то иначе решить проблему?


#2

Создайте в TabBarController’e протокол для обновления его VC.
Метод протокола будет принимать один объект с данными.
Все ваши 3 VC подпишите под данный протокол.
Реализуйте в каждом VC метод протокола и делайте необходимое обновление UI на основе полученных данных.
Так же в каждом VC при каком-то действии (отправке запроса и получении ответа), вызывайте метод делегата у TabBarController’a и передавайте туда полученные данные.
Таким образом все 3 VC смогут обновиться за счет одного запроса.


#3

Спасибо, буду копать в этом направлении. А случайно нет как-нибудь практических примеров?


#4

TabBarController

class TBController: ... {

    func viewDidLoad() {
        // инициализация ваших VC
    }

    func syncVC(with data: AnyObject) {
        VC1.updateView(with: data)
        VC2.updateView(with: data)
        VC3.updateView(with: data)
    }
}

Ваши VC (VC1, VC2, VC3)

class ViewController: ... {

    func updateView(with data: AnyObject) {
        //обновляете ваши таблицы и прочее
    }

    func alamofireAction() {
        //любой запрос
        //при получении ответа, в замыкании вызываете метод TBController'a
        Alamofire.request().response() {
            //обработка данных
            if let tbc = tabBarController as? TBController {
                tbc.syncVC(with: data)
            }
        }
    }
}

Примерно как-то так.
Изначально с делегатом я чет перемудрил. Но тоже можно.


#5

Огромное спасибо! Буду разбираться.


#6

В таббаре каждый контроллер существует отдельно. Сделай сервис который будет обрабатывать данные и хранить модель. А контроллеры будут к нему обращаться и запрашивать значения. И выводить на экран.


#7

Я так понимаю это надо прикручивать CoreData? С этим еще не сталкивался.


#8

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


#9

не надо кордату - у вас явно простые модели и заморачиваться с кордатой себе дороже… ))
сохраняй пришедшие данный в Реалм или в локальный файл yourfilename.plist на устройстве (инструкция) - это несложно, писать модель в файл. Его потом можно и бекапить в айклауд если нужно :wink: