簡體   English   中英

迅速:后台會話不支持完成處理程序塊。 請改用委托。”

[英]Swift: 'Completion handler blocks are not supported in background sessions. Use a delegate instead.'

我是Swift的新手,因此經驗不足。 我不知道為什么這不起作用。

我正在嘗試下載音樂文件,然后將其發送到AVAudoPlayer進行播放。

這是代碼:

@IBAction func startDownload(_ sender: Any) {
    weak var weakSelf = self
    let url = URL(string: "http://www.noiseaddicts.com/samples_1w72b820/280.mp3")!
    let task = DownloadManager.shared.activate().downloadTask(with: url as URL, completionHandler: { (URL, response, error) -> Void in

        print("URL = \(URL)")

        weakSelf!.plays(url: URL! as URL)

    })
    task.resume()
}

我得到的錯誤是:

DownloadTaskExample [31140:1527666] ***由於未捕獲的異常'NSGenericException'而終止應用程序,原因:'后台會話中不支持完成處理程序塊。 請改用委托。”

***首次拋出調用堆棧:(0 CoreFoundation 0x0000000110bbf34b exceptionPreprocess + 171 1 libobjc.A.dylib 0x000000010db2f21e objc_exception_throw + 48 2 CFNetwork 0x00000001111ada2c-[__ NSURLBackgroundSession validateSerializabilityForRequest:completion:] + 172NS CFresponse :: ] + 36 4 CFNetwork的0x00000001111af37c __90 - [__ NSURLBackgroundSession downloadTaskForRequest:downloadFilePath:resumeData:完成:] _ block_invoke + 38 5 CFNetwork的0x00000001111adddb __68 - [__ NSURLBackgroundSession performBlockOnQueueAndRethrowExceptions:] _ block_invoke + 67 6 libdispatch.dylib 0x0000000111aa00cd _dispatch_client_callout + 8 7 libdispatch.dylib 0x0000000111a7d30a _dispatch_barrier_sync_f_invoke + 340 8 CFNetwork 0x00000001111add44-[__ NSURLBackgroundSession performBlockOnQueueAndRethrowExceptions:] + 174 9 CFNetwork 0x00000001111af2e5-[__ NSURLBackgroundSession downloadTaskForRequest:downloadFilePath: resumeData:completion:] + 243 10 DownloadTaskExample 0x000000010d54086d _TFC19DownloadTaskExample14ViewController13startDownloadfP_T_ + 525 11 DownloadTaskExample 0x000000010d540e33 _TToFC19DownloadTaskExample14ViewController13startDownloadfP_T_ + 67 12 UIKit 0x000000010e3685b8-[UI從發送到控制:對於[UIApplication sendAction :: to:Control toEvent:] 67 14 UIKit 0x000000010e4ee1f6-[UIControl _sendActionsForEvents:withEvent:] + 444 15 UIKit 0x000000010e4ed0f2-[UIControl touchesEnded:withEvent:] + 668 16 UIKit 0x000000010e3d5ce1-[UIWindow _sendTouchesForEvent:] + 2747 17 UIKit 0x000000010e38463f-[UIApplication sendEvent:] + 371 19 UIKit 0x000000010eb7671d __dispatchPreprocessedEventFromEventQueue + 3248 20 UIKit 0x000000010eb6f3c7 __handleEventQueue + 4879 21 CoreFoundation 0x0000000110b64311 __CFRUNLOOP_IS_CALLINGSOUT_FACE_FUNCTION_FUNCTION_FUNCTION_FUNCTION b4959c __CFRunLoopDoSources0 + 556 23 CoreFoundation 0x0000000110b48a86 __CFRunLoopRun + 918 24 CoreFoundation 0x0000000110b48494 CFRunLoopRunSpecific + 420 25 GraphicsServices 0x000000011444da6f GSEventRunModal + 161 26 UIKit 0x000000010e366dy dydy 0x0000000111dy dydy dydy 0x00000001011366dy dydy 0 1 0 000000000000011d dydy 1 2 dydy 0 1 0 0 00000000 0 1 0 1 0 0 ddy 0 0 0 00000000 0 0 0 0 00000000000001 1 1 0 1 0 6 ddy 0 0 00000000 0 0 0 0 00000000000001 1 1 1 2 1 1 1d 0x0000000000000001 0x0 +1)

libc ++ abi.dylib:以類型為NSException的未捕獲異常終止

請有人幫助我,以便一旦下載文件,它就會傳遞到plays函數,這樣我就可以播放了:)

ps這是我正在使用的DownloadManager: https : //www.ralfebert.de/snippets/ios/urlsession-background-downloads/

這告訴你的是

  1. 當您創建URLSession ,您使用的后台配置對象,即,與background(withIdentifier:)方法上URLSessionConfiguration
  2. 您開始下載,並帶有完成塊。
  3. 這是不允許的。

不允許這樣做的原因是,在進行后台下載時,下載完成后您的應用可能無法運行,但是iOS希望喚醒您的應用以告知下載已完成。 一旦您的應用停止運行,該完成塊將不存在,因此這不是獲取該通知的有效方法。

您有兩種選擇:

  • 您可以停止使用后台會話。 類似於URLSessionConfiguration.default 不過,沒有后台下載。
  • 您可以刪除回調,而可以使用URLSessionDelegate聲明的方法來獲取下載結果。

暫無
暫無

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

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