Я разрабатываю приложение заказов, и я новичок в этом. Итак, мне нужно проверить наличие обновлений в моей базе данных (используя 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 и всеми его связями и снова создаю его. Я знаю, что это не лучший способ. Есть ли другой способ обновить весь объект?
У меня нет никого рядом со мной, чтобы обсуждать эти вопросы. Я новичок в этом, и у меня много сомнений по поводу других функций. Кто-нибудь может обсудить некоторые из них, пожалуйста? Мне просто нужно несколько советов, я могу искать больше самостоятельно. Любая помощь приветствуется. Буду очень признателен.