Почему приложение замораживания вставки Coredata становится фоновым iOS - PullRequest
0 голосов
/ 02 марта 2020

В моем приложении мне нужно скачать огромные 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 файла. Пожалуйста, помогите мне с предложением. Можно ли вставить в то время как приложение в фоновом режиме в течение длительного времени процесса?.

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