Проверка фона обновлений в базе данных до CoreData Swift 4 - PullRequest
0 голосов
/ 12 ноября 2018

Я разрабатываю приложение заказов, и я новичок в этом. Итак, мне нужно проверить наличие обновлений в моей базе данных (используя Alamofire для доступа к моему C # / Asp.net бэкэнду, который проверяет MySQL. Также используя Core Data для моего SQLite). Я искал лучший способ сделать все несколько недель назад, но я не уверен, что все идет лучше. Также у меня возникли некоторые проблемы.

1. Чтобы получить изменения на MySql, я использую таймер, чтобы каждый час проверять его на фоне, а затем уведомлять пользователя. Это не работает на фоне, только на переднем плане. Кто-нибудь может мне помочь, пожалуйста? Текущий код, который работает на переднем плане, на MainViewController:

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5)) {
            //get most recent date from orders
            let strdata = self.getMostRecentDtPedido()
            if self.defaults.getDownloadInitialPedido(){
                if strdata != "" {
                    self.loadOrdersFromLastSyncByApi(strdata)
                }
            }
        }

        var timer = Timer.scheduledTimer(withTimeInterval: 3600.0, repeats: true) {
            timer in
            self.backgroundTaskPerHour(timer: timer)
        }
func backgroundTaskPerHour(timer:Timer) {
        DispatchQueue.global(qos: DispatchQoS.background.qosClass).async {
            let strdata = self.getMostRecentDtPedido()

            if self.defaults.getDownloadInicialPedido(){
                if strdata != "" {
                    self.loadOrdersFromLastSyncByApi(strdata)
                }
            }
        }
    }

2. Помимо этой проблемы, каждый раз, когда я вхожу в MainViewController, эта задача (из первого DispatchQueue) отправляется снова. Я хотел бы, чтобы он запускался только в первый раз, когда пользователь открывает приложение, а затем в час. Что мне нужно изменить? Я думал о создании вспомогательной переменной, которая была бы установлена ​​в true или false, если она уже прошла впервые, но я думаю, что это слишком много работы. Я уверен, что есть лучший способ сделать это.

3. Хорошо, после получения обновленного заказа Alamofire возвращает мне весь заказ с таким же идентификатором из существующего. Проблема в том, что мой заказ имеет много атрибутов и взаимосвязей с большим и большим количеством атрибутов. Я потратил бы кучу времени и строк кода, обновляя каждое поле, например «order.setValue(“\(price)”, forKey: “price”)». Так как этот заказ может обновлять любое поле, это может быть количество, дата, цена, статус и их взаимосвязи. Я хотел бы, как и на моем Android, просто отправить весь объект и быстро обновить все для меня. Я искал и не могу найти что-то подобное. Что я сделал? Я получаю Id, удаляю старый ордер с этим Id и всеми его связями и снова создаю его. Я знаю, что это не лучший способ. Есть ли другой способ обновить весь объект?

У меня нет никого рядом со мной, чтобы обсуждать эти вопросы. Я новичок в этом, и у меня много сомнений по поводу других функций. Кто-нибудь может обсудить некоторые из них, пожалуйста? Мне просто нужно несколько советов, я могу искать больше самостоятельно. Любая помощь приветствуется. Буду очень признателен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...