我要从Firebase Function下载文本文件,分析该文件中的数据,然后将数据插入我的应用程序中的sqlite中。我在那个文本文件中有超过1,000,000条记录。当应用程序处于前台模式时,这可以正常工作。我想在应用程序处于后台模式时完成此任务,但是当应用程序进入后台时,解析和插入被暂停。
这是我正在使用的代码,
WITH cte AS
(
SELECT DISTINCT
Lab_Space_Id
FROM
EHS_Assessment_Audit
WHERE
Audit_Date >= DATEADD(year, -1, GETDATE())
)
SELECT
l.Site_Name, l.Campus_Name,
COUNT(DISTINCT s.id) Total,
SUM(CASE WHEN a.Lab_Space_ID IS NOT NULL THEN 1 ELSE 0 END) Audited
FROM
Lab_Space s
LEFT OUTER JOIN
cte a ON s.id = a.Lab_Space_Id
JOIN
Locations l ON l.Building_Code = s.Building_Code
GROUP BY
l.Site_Name, l.Campus_Name
ORDER BY
l.Site_Name, l.Campus_Name
但是,我的backgroundTask在几秒钟后暂停了。如果我删除了var backgroundDownload3 : UIBackgroundTaskIdentifier?
func downloadBook(at indexPath : IndexPath) {
backgroundDownload3 = UIApplication.shared.beginBackgroundTask(expirationHandler: {
if let task = backgroundDownload3 {
UIApplication.shared.endBackgroundTask(task)
backgroundDownload3 = UIBackgroundTaskIdentifier.invalid
}
})
DispatchQueue.global().async {
self.fetchInteractionData(at: indexPath)
}
}
func fetchInteractionData(at indexPath : IndexPath){
//Firebase Function to download textFile
//download completed
downloadTask.observe(.success) { snapshot in
self.parseAndSaveToDataBase(fileName : name, at: indexPath)
}
}
func parseAndSaveToDataBase(fileName : String, at indexPath : IndexPath) {
//Parsing data from text file
//batch Insert (500 records) with db.transaction
// Once all the record are inserted
if let task = backgroundDownload3 {
UIApplication.shared.endBackgroundTask(task)
backgroundDownload3 = UIBackgroundTaskIdentifier.invalid
}
}
,它会继续在后台运行,但是一段时间后,应用会被expirationHandler endBackgroundTask
杀死
我看着类似的问题,才知道这可能是内存或CPU使用率高。
我的CPU每次使用率约为95%,当应用程序被杀死时,内存使用率介于40 MB到80 MB之间。这是在后台发生的唯一过程。我不确定如何才能继续在后台模式下解析和插入数据。如何减少CPU或内存使用量或延长后台运行时间。请让我知道是否需要进一步澄清。任何帮助将不胜感激。