Swift 2.0: планирование фоновой задачи для загрузки неудачных загрузок продукта

Я разрабатываю приложение, которое загружает продукт (JSON) на сервер. Теперь каждый объект продукта состоит из множества изображений. Продукт загружается на сервер, только если все изображения, связанные с этим продуктом, уже загружены. Если все изображения для продукта не были загружены, продукт должен быть сохранен в состоянии "В ОЖИДАНИИ" в мобильной базе данных (я использую Realm).

Я хочу, чтобы фоновая задача периодически (каждые 15 минут) проверяла базу данных на предмет таких неудачных загрузок продукта, проверяла, все ли изображения, связанные с продуктом, уже загружены, и ставит в очередь продукт для загрузки на сервер.

Эта фоновая задача будет выполняться ТОЛЬКО во время работы приложения, а не иначе. Задача должна быть запущена при загрузке и убита при закрытии приложения.

Я нашел некоторые подходящие решения (касающиеся NSTimer и фоновых режимов в iOS и т. Д.), Но ничего не решает мою проблему напрямую. Пожалуйста, направьте меня в правильном направлении! Спасибо!

1 ответ

Решение

Фоновые режимы полезны, когда вам нужно, чтобы фоновые задачи выполнялись, когда приложение не запущено, поэтому это не то, что вам нужно. NSTimer может выполнить работу здесь, и вам нужно запланировать ее после того, как приложение станет активным в делегате приложения и сделать недействительным сразу после того, как приложение войдет в фоновый режим. Простой пример может выглядеть так:

var timer:NSTimer!

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    timer = NSTimer.scheduledTimerWithTimeInterval(60 * 15, target: self, selector: "uploadData", userInfo: nil, repeats: true)

    return true
}

func applicationDidEnterBackground(application: UIApplication) {
    timer.invalidate()
}

func applicationWillEnterForeground(application: UIApplication) {
    timer = NSTimer.scheduledTimerWithTimeInterval(60 * 15, target: self, selector: "uploadData", userInfo: nil, repeats: true)
}

func uploadData(){

    // Query unsychronzied data and send them to server here
}
Другие вопросы по тегам