executeBackgroundTask не сохраняется, когда приложение в фоновом режиме Swift - PullRequest
0 голосов
/ 30 августа 2018

Я использую Xcode 9 и Swift 4. Я запускаю загрузку нескольких файлов JSON, когда приложение находится на переднем плане. Затем приложение анализирует эти файлы и сохраняет их в CoreData. Это хорошо работает, когда приложение находится на переднем плане. Однако, если приложение находится в фоновом режиме, файлы по-прежнему загружаются правильно, но данные не анализируются и сохраняются в CoreData. Только когда пользователь возвращается на передний план, анализ и сохранение данных продолжаются.

У меня включены фоновые режимы - Фоновая выборка и Удаленные уведомления.

У меня есть около 10 функций, похожих на приведенную ниже, в которой он обрабатывает файлы JSON одновременно:

func populateStuff(json: JSONDictionary) -> Void {
    let results = json["result"] as! JSONDictionary
    let stuffData = results["Stuff"] as! [JSONDictionary]

    let persistentContainer = getPersistentContainer()

    persistentContainer.performBackgroundTask { (context) in
        for stuff in stuffData {
            let newStuff = Stuff(context: context)
            newStuff.stuffCode = stuff["Code"] as? String
            newStuff.stuffDescription = stuff["Description"] as? String

            do {
                try context.save()
            } catch {
                fatalError("Failure to save context: \(error)")
            }
        }
    }
}

func getPersistentContainer() -> NSPersistentContainer {
    let persistentContainer = NSPersistentContainer(name: "MyProjectName")
    persistentContainer.loadPersistentStores { (_, error) in
        if let error = error {
            fatalError("Failed to load core data stack: \(error.localizedDescription)")
        }
    }
    persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
    persistentContainer.viewContext.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
    return persistentContainer
}

Может кто-нибудь посоветовать мне, почему это может произойти и как это преодолеть?

1010 * ТИА *

1 Ответ

0 голосов
/ 18 сентября 2018

Используйте метод beginBackgroundTaskWithName:expirationHandler::

func populateStuff(json: JSONDictionary) -> Void {

    // Perform the task on a background queue.
    DispatchQueue.global().async {

        // Request the task assertion and save the ID.
        self.backgroundTaskID = UIApplication.shared.beginBackgroundTask (withName: "Finish Network Tasks") {

        // End the task if time expires.
        UIApplication.shared.endBackgroundTask(self.backgroundTaskID!)
        self.backgroundTaskID = UIBackgroundTaskInvalid
    }

    // Parse the json files 
    let results = json["result"] as! JSONDictionary
    let stuffData = results["Stuff"] as! [JSONDictionary]

    let persistentContainer = getPersistentContainer()

    persistentContainer.performBackgroundTask { (context) in
        for stuff in stuffData {
            let newStuff = Stuff(context: context)
            newStuff.stuffCode = stuff["Code"] as? String
            newStuff.stuffDescription = stuff["Description"] as? String

            do {
                try context.save()
            } catch {
                fatalError("Failure to save context: \(error)")
            }
        }
    }

    // End the task assertion.
    UIApplication.shared.endBackgroundTask(self.backgroundTaskID!)
    self.backgroundTaskID = UIBackgroundTaskInvalid
}

Вызов этого метода дает вам дополнительное время для выполнения важных задач. Обратите внимание на использование метода endBackgroundTask: сразу после выполнения задачи. Это позволяет системе знать, что вы сделали. Если вы не завершите свои задачи своевременно, система закроет ваше приложение.

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