Swift 背景URLSession+;结合

Swift 背景URLSession+;结合,swift,combine,Swift,Combine,尝试使用URLSession的dataTaskPublisher方法发送后台请求时: URLSession(配置:URLSessionConfiguration.background(带标识符:“示例”)) .dataTaskPublisher(用于:URL(字符串):https://google.com")!) .map(\.data) .sink(接收完成:{print($0)}{print($0)} 我收到了错误 Completion handler blocks are not su

尝试使用
URLSession
dataTaskPublisher
方法发送后台请求时:

URLSession(配置:URLSessionConfiguration.background(带标识符:“示例”))
.dataTaskPublisher(用于:URL(字符串):https://google.com")!) 
.map(\.data)
.sink(接收完成:{print($0)}{print($0)}
我收到了错误

Completion handler blocks are not supported in background sessions. Use a delegate instead.
这对我来说很有意义,
sink
是一组完成处理程序。因此,我尝试建立一个
订户

类示例订阅者:订阅者{
typealias输入=数据
typealias Failure=URLError
func接收(订阅:订阅){
订阅请求(.max(1))
}
func-receive(uu-input:Data)->Subscribers.Demand{
打印(输入)
return.Demand.none
}
func receive(完成:Subscribers.completion){}
}
并使用
订阅者订阅

URLSession(配置:URLSessionConfiguration.background(带标识符:“示例”))
.dataTaskPublisher(用于:URL(字符串):https://google.com")!)
.map(\.data)
.subscribe(例如subscriber())
我收到了同样的错误:

Completion handler blocks are not supported in background sessions. Use a delegate instead.

是否可以使用
dataTaskPublisher
执行后台请求,或者我必须使用对
URLSession
的委托?

URLSession。dataTaskPublisher
构建在
URLSessionDataTask
之上,并在任务上设置完成处理程序。因此,您不能将
DataTaskPublisher
用于后台会话

您可以找到
DataTaskPublisher
的源代码。以下是:


这可能会有帮助:@NewDev是的,我知道在使用say
dataTask
时,不能同时使用完成处理程序和后台会话。我特别想问的是,是否可以使用Combine和后台会话。特别是在添加特定的
订户时,它似乎类似于委托。但我明白这可能是不可能的。你不能在后台会话中使用
DataTaskPublisher
,因为它在后台使用完成处理程序。显然,您可以创建自己的使用委托实现的应用程序,但后台会话的整个思想是,这些请求不仅能够在应用程序挂起后存活,而且能够在应用程序生命周期的自然过程中被丢弃。所以,当请求完成时,操作系统会启动你们的应用程序,在应用程序挂起之前创建的完成块和合并发布程序都不存在了。因此,将其与后台会话结合使用是没有意义的。
let task = p.session.dataTask(
    with: p.request,
    completionHandler: handleResponse(data:response:error:)
)