Swift URLSession dataTaskPublisher,重试为MJPEG流

Swift URLSession dataTaskPublisher,重试为MJPEG流,swift,combine,Swift,Combine,我正在尝试使用URLSession.dataTaskPublisher创建一个连接到MJPEG流的重试发布服务器 不幸的是,我的订户从未真正收到任何数据,尽管我可以看到数据被传输,RAM消耗缓慢增加。因此,流是开放的,数据被接收,但不是在订户上。我有一个版本,它只接收了一次数据,但随后立即关闭了流 我尝试了许多不同的配置,但以下似乎最接近目标: 我错过了什么?以前有人遇到过这种内存泄漏吗 我最感兴趣的是超时错误,但也希望在其他东西无法正常工作时重试 var可取消项:Set=[] 让url=url

我正在尝试使用
URLSession.dataTaskPublisher
创建一个连接到MJPEG流的重试发布服务器

不幸的是,我的订户从未真正收到任何数据,尽管我可以看到数据被传输,RAM消耗缓慢增加。因此,流是开放的,数据被接收,但不是在订户上。我有一个版本,它只接收了一次数据,但随后立即关闭了流

我尝试了许多不同的配置,但以下似乎最接近目标:

我错过了什么?以前有人遇到过这种内存泄漏吗

我最感兴趣的是
超时
错误,但也希望在其他东西无法正常工作时重试

var可取消项:Set=[]
让url=url(字符串:http://mjpeg.stream")!
let configuration=URLSessionConfiguration.ephemeral
configuration.timeoutitervalforrequest=1
configuration.requestCachePolicy=.reloadIgnoringLocalAndRemoteCacheData
让datataskpublisher=URLSession(配置:配置)
.dataTaskPublisher(用于:url)
让catcher=datataskpublisher
.tryCatch{(错误)->中的任何发布服务器
打印(“错误:\(错误代码)”)
抛出错误
}.删除任何发布者()
让我们再来一遍
.catch{(错误)->中的任何发布服务器
打印(“重试”)
return catcher.delay(对于:0.5,调度程序:DispatchQueue.global()).eraseToAnyPublisher()
}
.删除任何发布者()
复述者
.sink(receiveCompletion:{结果为
打印(“已完成”)
切换结果{
案例。失败(让失败):
打印(“失败\(失败)”)
案例。完成:
打印(“完成”)
}
},receiveValue:{值,响应在
打印(“数据”)
让数据=值
//解析数据
})
.store(in:&self.cancelables)

URLSession.DataTaskPublisher不适合此用途。它最多只能发出一个输出。您可以查看以了解原因:它创建了一个带有完成处理程序的
URLSessionDataTask
。当任务收到完整响应时,它只调用一次完成处理程序


如果希望在数据到达时接收数据,则需要创建符合的对象,并将该对象用作
URLSession
的委托。苹果没有提供这样的
出版商。如果您想要一个以增量方式提供数据的
发布服务器
,您必须自己编写。

我已经用urlsessionelegate实现了它,我只想使用更“现代”的dataTaskPublisher。谢谢你的信息!尽管我仍然很好奇,为什么我可以看到网络正在通过Xcode中的调试会话视图接收数据,而我在任何一端都没有接收到数据。