簡體   English   中英

Swiftui 任務未在后台任務中運行

[英]Swiftui Task not running in Background task

我已經在我的應用程序上成功配置了后台任務,其中一個函數將直接調用 URL 並處理數據,但我最近更改了這一點,以便函數調用 URL,保存到文檔目錄,然后處理數據。 由於我已經更新了這個,我的后台任務不再觸發。

在對上一個問題提出建議后,我嘗試將函數包裝在Task中,但我無法讓后台任務完全觸發/完成。 有時它只會打印運行打印,有時它只會重新安排下一次更新,有時它會打印和安排但任務似乎永遠不會運行。 任何幫助將非常感激。 謝謝!

27/06 更新:自發布以來,我對此進行了更多故障排除,看起來問題不在於任務正在運行,而是應用程序未處理let (url, response) = try await session.download(for: request)在后台任務中的函數內。

這在應用程序中按預期運行,但在后台任務時無法完成。 是否需要任何其他步驟或配置更改才能將此作為后台任務運行? 干杯

BG處理任務:

func handleAppRefresh(task: BGProcessingTask) {
    //Schedules another refresh
    scheduleAppRefresh()
        Task.detached {
            do {
                print("BGTask fired")
                let events = try await BGloadCSV(from: "Eventtest")
                
                print(events)
            } catch {
                print(error)
            }
        }
    print("handleAppRefresh fired")
}

運行函數:

func BGloadCSV(from csvName: String) async throws -> [CSVEvent] {
   var csvToStruct = [CSVEvent]()

   // Creates destination filepath & filename
   let documentsUrl:URL =  (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL?)!
   let destinationFileUrl = documentsUrl.appendingPathComponent("testcsv.csv")

   //Create URL to the source file to be downloaded
   let fileURL = URL(string: "https://example.com/testcsv.csv")!

   let sessionConfig = URLSessionConfiguration.default
   let session = URLSession(configuration: sessionConfig)

   let request = URLRequest(url:fileURL)

   let (url, response) = try await session.download(for: request)

   if let statusCode = (response as? HTTPURLResponse)?.statusCode {
    print("File downloaded Successfully. Response: \(statusCode)")
    }
   let _ = try FileManager.default.replaceItemAt(destinationFileUrl, withItemAt: url)
   let data = readCSV(inputFile: "testcsv.csv")

   var rows = data.components(separatedBy: "\n")

   rows.removeFirst()

   // Iterates through each row and sets values
   for row in rows {
       let csvColumns = row.components(separatedBy: ",")
       let csveventStruct = CSVEvent.init(raw: csvColumns)
       csvToStruct.append(csveventStruct)
    }
   print("LoadCSV has run and created testcsv.csv")

   pullData(events: csvToStruct)
   return csvToStruct
  }

在本文和提供的示例項目的幫助下,我能夠將 URLSession 重新創建為后台任務。

https://www.ralfebert.com/ios-examples/networking/urlsession-background-downloads/

希望它在未來對其他人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM