Ios 当应用程序处于后台时,performBackgroundTask未保存

Ios 当应用程序处于后台时,performBackgroundTask未保存,ios,json,swift,core-data,background,Ios,Json,Swift,Core Data,Background,我使用的是Xcode 9和Swift 4。当应用程序位于前台时,我开始下载多个JSON文件。然后应用程序解析这些文件并将其保存到CoreData。当应用程序处于前台时,这种方法很有效。但是,如果应用程序在后台,文件仍然可以正确下载,但数据不会被解析并保存到CoreData。只有当用户返回前台时,数据的解析和保存才会继续 我打开了后台模式-后台获取和远程通知 我有大约10个函数,它们与下面的一个函数类似,它同时处理JSON文件: func populateStuff(json: JSONDicti

我使用的是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
}
有人能告诉我为什么会发生这种情况,以及如何克服这种情况吗

TIA使用以下方法:

调用此方法会给您额外的时间来执行重要任务。注意在任务完成后立即使用方法。它让系统知道您已经完成了。如果您没有及时结束任务,系统将终止您的应用程序

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
}