В моем приложении мне нужно скачать огромные zip-файлы из api, а затем извлечь их в папку документа и обработать этот zip один за другим. Zip-файлы имеют тип json, и я беру один за другим и сохраняю их в CoreData. Я проверил, что обработка на переднем плане в порядке, и когда приложение переходит в задний план, оно некоторое время останавливается. Затем мне нужно установить передний план, чтобы продолжить. Также я получил ошибку времени, такую как CoreData: error: неожиданная отмена утверждения фоновой задачи. Каков будет правильный способ обработки, когда приложение в заднем плане? Пожалуйста, предложите. На самом деле Zip похож на 1.gb, а после извлечения 2.gb нужно обработать. Код, который я делаю для одного почтового индекса:
func saveArticles(articleData:[Articles],result: @escaping (_ resultItem:Bool)->Void){
var textLog = TextLog()
// textLog.write("\nArticles saving\n")
if articleData.count > 0 {
let dispatchQueue = DispatchQueue(label: "ArticleSaving", qos: .background)
dispatchQueue.async{
TestCoredataManagerClass.shared.persistentContainer.performBackgroundTask { (managed_Context) in
var counter:Int = 0
let articleEntity = NSEntityDescription.entity(forEntityName: "TestArticles", in: managed_Context)!
for article in articleData{
print("article cat count = \(article.categoryId!.count)")
self.deleteRowBy(entityName: "TestArticles", rowName: "articleId", id: article._id!, context: managed_Context)
self.deleteRowBy(entityName: "TestArticleData", rowName: "articleId", id: article._id!, context: managed_Context)
self.fetchCategoryListNew(docContext: managed_Context, categoryIds: article.categoryId ?? []) { (categories, status) in
let dbArticle:TestArticles = NSManagedObject(entity: articleEntity, insertInto: managed_Context) as! TestArticles
dbArticle.articleId = article._id
dbArticle.articleName = article.articleName
dbArticle.articleNumber = "\(article.articleNumber ?? 0)"
dbArticle.version = article.version ?? 0.0
dbArticle.date = article.date
dbArticle.approvedBy = article.approvedBy
if let publishedDate = article.date {
if let published:Date = publishedDate.toDate(withFormat: TestDateFormat.longDateTimeMilliSecondsTZ.rawValue){
dbArticle.publishedDate = published as Date
}
}
var dbTagArray:[TestDocumentTags] = []
let tagEntity = NSEntityDescription.entity(forEntityName: "TestDocumentTags", in: managed_Context)!
for tag:Tags in article.tags ?? []{
let dbTag:TestDocumentTags = NSManagedObject(entity: tagEntity, insertInto: managed_Context) as! TestDocumentTags
dbTag.appId = tag.appId
dbTag.tagId = tag._id
dbTag.isActive = tag.isActive!
dbTag.name = tag.name
dbTagArray.append(dbTag)
}
dbArticle.tags = NSSet(array: dbTagArray)
dbArticle.groups = []
var categoryNameList = ""
if(categories.count > 0){
for (index,cat) in categories.enumerated() {
if index == categories.count-1 {
categoryNameList.append(cat.name ?? "")
}
else{
if let catName = cat.name{
categoryNameList.append(catName + "," )
}
}
}
dbArticle.categoryNames = categoryNameList
dbArticle.articleCategory = NSSet(array: categories)
}
let articleDataEntityTable = NSEntityDescription.entity(forEntityName: "TestArticleData", in: managed_Context)!
let dbArticleDataRow:TestArticleData = NSManagedObject(entity: articleDataEntityTable, insertInto: managed_Context) as! TestArticleData
dbArticleDataRow.articleId = article._id
dbArticleDataRow.articleData = article.documentData
// textLog.write("Article Saved" + article.articleName! + "\n")
counter = counter+1
if(counter == articleData.count){
if managed_Context.hasChanges {
do {
try managed_Context.save()
result(true)
} catch {
result(true)
textLog.write("---------***Article****--------------")
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
textLog.write("\nArticle error\(nserror)\n")
}
}
}
}
}
}
}
}
else{
result(true)
}
}
func deleteRowBy(entityName:String,rowName:String,id:String,context:NSManagedObjectContext){
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
fetchRequest.predicate = NSPredicate(format:"\(rowName) = %@", id)
do {
let request = try context.fetch(fetchRequest)
for req in request {
context.delete(req as! NSManagedObject)
}
}
catch{
print("Error")
}
}
func fetchCategoryListNew(docContext:NSManagedObjectContext,categoryIds:[String],requestedCategory: @escaping (_ resultItem:[TestCategories],_ status:Bool) -> Void){
let articleFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "QdmsCategories")
articleFetch.predicate = NSPredicate(format: "categoryId IN %@", categoryIds)
let requestedArticles:[QdmsCategories] = try! docContext.fetch(articleFetch) as! [TestCategories]
if(requestedArticles.count > 0){
requestedCategory(requestedArticles,true)
}
else{
requestedCategory([],false)
}
}
Я беру каждый json файл и реализую функцию обработчика завершения для каждого json файла. Пожалуйста, помогите мне с предложением. Можно ли вставить в то время как приложение в фоновом режиме в течение длительного времени процесса?.