实现与 URLSession 发布者和合并的重新连接

2024-02-16

我想知道是否有一种方法可以实现重连机制与新的Apple框架结合并使用URLSession发布者

  • 试图在 WWDC 2019 中找到一些例子
  • 尝试玩waitsForConnectivity运气不好(它甚至没有在自定义会话中调用委托)
  • tried URLSession.background但在发布过程中崩溃了。

我也不明白我们如何以这种方式跟踪进度
有人已经尝试过这样做吗?

upd:
这好像是waitsForConnectivity 不管用 https://developer.apple.com/documentation/ios_ipados_release_notes/ios_ipados_13_beta_8_release_notes在 Xcode 11 测试版中

upd2:
Xcode 11 通用汽车 -waitsForConnectivity正在工作但是ONLY在设备上。使用默认会话,设置标志并实现会话委托。方法task is waiting for connectivity无论您是否使用带回调的 init 任务,都会被调用。

public class DriverService: NSObject, ObservableObject {

    public var decoder = JSONDecoder()
    public private(set) var isOnline = CurrentValueSubject<Bool, Never>(true)

    private var subs = Set<AnyCancellable>()
    private var base: URLComponents
    private  lazy var session: URLSession = {
        let config = URLSessionConfiguration.default
        config.waitsForConnectivity = true
        return URLSession(configuration: config, delegate: self, delegateQueue: nil)
    }()

    public init(host: String, port: Int) {

        base = URLComponents()
        base.scheme = "http"
        base.host = host
        base.port = port

        super.init()

//      Simulate online/offline state
//
//        let pub = Timer.publish(every: 3.0, on: .current, in: .default)
//        pub.sink { _ in
//            let rnd = Int.random(in: 0...1)
//            self.isOnline.send(rnd == 1)
//        }.store(in: &subs)
//        pub.connect()
    }

    public func publisher<T>(for driverRequest: Request<T>) -> AnyPublisher<T, Error> {

        var components = base
        components.path = driverRequest.path

        var request = URLRequest(url: components.url!)
        request.httpMethod = driverRequest.method

        return Future<(data: Data, response: URLResponse), Error> { (complete) in
            let task = self.session.dataTask(with: request) { (data, response, error) in
                if let err = error {
                    complete(.failure(err))
                } else {
                    complete(.success((data!, response!)))
                }
                self.isOnline.send(true)
            }
            task.resume()
        }
        .map({ $0.data })
        .decode(type: T.self, decoder: decoder)
        .eraseToAnyPublisher()
    }
}

extension DriverService: URLSessionTaskDelegate {

    public func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {
        self.isOnline.send(false)
    }

}

你有没有尝试过retry(_:)然而?它可以在Publishers 并在失败时重新运行请求。

如果您不希望请求因所有失败而立即重新运行,那么您可以使用catch(_:)并决定哪些故障需要重新运行。

这是一些实现获取进度的代码。

enum Either<Left, Right> {
    case left(Left)
    case right(Right)

    var left: Left? {
        switch self {
        case let .left(value):
            return value
        case .right:
            return nil
        }
    }

    var right: Right? {
        switch self {
        case let .right(value):
            return value
        case .left:
            return nil
        }
    }
}

extension URLSession {
    func dataTaskPublisherWithProgress(for url: URL) -> AnyPublisher<Either<Progress, (data: Data, response: URLResponse)>, URLError> {
        typealias TaskEither = Either<Progress, (data: Data, response: URLResponse)>
        let completion = PassthroughSubject<(data: Data, response: URLResponse), URLError>()
        let task = dataTask(with: url) { data, response, error in
            if let data = data, let response = response {
                completion.send((data, response))
                completion.send(completion: .finished)
            } else if let error = error as? URLError {
                completion.send(completion: .failure(error))
            } else {
                fatalError("This should be unreachable, something is clearly wrong.")
            }

        }
        task.resume()
        return task.publisher(for: \.progress.completedUnitCount)
            .compactMap { [weak task] _ in task?.progress }
            .setFailureType(to: URLError.self)
            .map(TaskEither.left)
            .merge(with: completion.map(TaskEither.right))
            .eraseToAnyPublisher()
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现与 URLSession 发布者和合并的重新连接 的相关文章

  • SwiftUI:如何让项目的拖放重新排序起作用?

    我有以下 SwiftUI 视图 struct ContentView View State var model Model var body some View ScrollView LazyVGrid columns columns sp
  • “不能在集合中使用 in/contains 运算符”

    单击搜索栏时出现此错误 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 无法在集合中使用 in contains 运算符 Assignment 4 SearchResult studentID
  • 带有自定义 init 的 SwiftUI 视图

    假设我正在制作一个如下所示的自定义输入元素 struct CustomInput View Binding var text String var name String var body some View TextField name
  • Xcode 11 - 在 Catalyst Swift 中禁用调整大小模式

    We are 将我们基于 Swift 的 iOS 应用程序转换为 Mac兼容使用Catalyst在 Xcode 11 中 当用户使用时 我们在 UI 中面临一个问题resize应用程序窗口 那么我们可以禁用调整大小模式并为应用程序窗口提供修
  • 在 Safari 中快速打开链接

    我目前正在我的应用程序中打开链接WebView 但我正在寻找一个打开链接的选项Safari反而 它不是 融入 Swift 但你可以使用标准UIKit方法来做到这一点 看看 UIApplication 的openUrl https devel
  • 如何在 Swift 中使用 deltaTime 正确计算 1 秒

    我正在尝试计算经过的秒数deltaTime但我不知道该怎么做 因为我的deltaTime不断打印 0 0166 或 0 0167 这是我的代码 override func update currentTime CFTimeInterval
  • 视频中的图像/文本叠加 swift

    我正在使用 swift 在视频中使用图像叠加来实现水印效果 我正在使用AVFoundation为此 但不知何故我没有成功 以下是我的覆盖图像 文本的代码 let path NSBundle mainBundle pathForResourc
  • UNTimeIntervalNotificationTrigger nextTriggerDate() 是否给出了错误的日期?

    我正在更新本地通知以与 iOS 10 配合使用 但遇到了一个问题 我认为 nextTrigger 函数返回的不是 满足触发条件的下一个日期 而是返回当前日期时间加上您最初设置 UNTimeInvervalNotificationTrigge
  • Swift 错误:发出 SIGABRT 信号如何解决

    我只是 Swift 编码的初学者 我的想法很简单 就是一个有两个按钮的应用程序 单击时 文本字段将更改其文本 在 Main StoryBoard 中 我添加一个文本字段和两个按钮 在 ViewController swift 文件中 我这样
  • 在 Swift 中将时间数组从 24 小时转换为 12 小时

    我有一个像这样的数组 arrayTimes 16 00 16 30 17 00 17 30 18 00 18 30 我想将数组从 24 小时转换为 12 小时 这是我到目前为止所拥有的 它转换数组中的第一个数字 我遗漏了一些东西 但我无法解
  • 在 MLMediaLibrary 中加载媒体源时出错

    我在加载时遇到错误mediaSourcesMac OS X 中的属性 我正在尝试使用以下方法获取 Apple Photos 源MLMediaLibrary class 我的应用程序是沙盒的 并且具有图片文件夹的只读权限 我收到错误 MLMe
  • 在 Xcode 6 - Swift 中使用自定义字体 [重复]

    这个问题在这里已经有答案了 我是斯威夫特新手 我想知道如何在 Xcode 6 的 swift 应用程序中使用自定义字体 您只需将字体文件 ttf 拖到 Xcode 左侧窗格的资源区域中即可 当您将其放入时 会出现一个对话框 确保您的应用程序
  • 带有预填充 .sqlite 的核心数据 (Swift3)

    目前 我正在对现有 iOS9 应用程序进行 Swift3 iOS10 更新 该应用程序存储了欧洲各地约 10 000 个电动汽车充电点 到目前为止 我总是为应用程序提供预填充的数据库 xcappdata 包中的 sqlite sqlite
  • 从 firebase swift 读取数据

    我正在尝试从 firebase 数据库检索数据 但是当我运行代码时 它没有显示任何内容 但没有显示错误 我从Firebase手册中得到了这段代码 顺便说一句 我很确定路径是正确的 let ref FIRDatabase database r
  • 如何实现pickerView类的didSelectRow方法?

    我以前从未使用过选择器视图 我认为它类似于表视图类的 func tableView tableView UITableView didDeselectRowAtIndexPath indexPath NSIndexPath 方法 但是我无法
  • 自定义 UISearchController 动画

    底线问题 如何覆盖取消属于 UISearchController 的 searchBar 的默认动画 标准搜索控制器行为 好的 我正在尝试为附加到 UISearchController 的 UISearchBar 变为活动状态时创建自定义动
  • 哪里可以找到关于 swift Alert (UIAlertController) 的明确解释?

    对此找不到清晰且信息丰富的解释 在某个主题上搜索了一段时间后 我没有 找到清晰的解释 即使在它的类参考中UIAlertController 参考 https developer apple com library ios documenta
  • ios file:///var/mobile/Containers 和 file:///private/var/mobile/Containers 之间有什么区别吗?

    它们是不同的还是简单的别名 我通过运行以下命令获取 private var FileManager default contentsOfDirectory at folder includingPropertiesForKeys optio
  • 在 Swift 中上传带有其他参数的多张图片

    现在 我通过下面给出的代码仅将一张图像上传到服务器端脚本上的服务器 现在我有一个数组UIImage 我想知道如何使用UIImageJPEGRepresentation myImageView image 0 1 将所有图像发布到UIImag
  • 应用内购买导致偶尔崩溃

    我在互联网上搜索了这方面的帮助 但没有结果 我的应用程序已在应用程序商店中上线 少数用户报告应用程序在进行应用内购买后冻结并崩溃 我的游戏中唯一的 IAP 它基本上解锁了完整版本 即使他们重新启动设备并尝试继续 设备也会再次崩溃 我无法重现

随机推荐

  • 软件渲染不支持 Oreo 中的硬件位图

    LinearLayout llQRCodeShare try llQRCodeShare setDrawingCacheEnabled true llQRCodeShare buildDrawingCache true Bitmap b l
  • 如何使 haml 中的文本和变量出现在同一行?

    我有这段代码 我希望它在同一行上读作 Volunteers Needed 10 event numberofvolunteers value 我怎样才能在不使用CSS的情况下做到这一点 我还没有找到解决这个问题的具体帖子 td Volunt
  • 计算球体的顶点法线

    我想知道如何获取存储在缓冲区中的每个球体的顶点 并分别计算每个球体的法线 可以在 OpenGL 中实现吗 OpenGL 通常用于渲染网格 而不是计算它们 法线是网格数据的一部分 提供法线通常是网格体构建者的责任 对于球体来说 法线的计算非常
  • vswprintf 在 Mac OS X 下对于某些 unicode 代码点失败

    我收到莫名其妙的失败 返回值 1 vswprintf使用GCC和Mac OS X 在Mac OS X 10 6和10 8下使用gcc 4 0和4 2 1进行测试 Linux下的GCC是not做作的 Visual Studio 也是not做作
  • 在彩色背景中渲染透明文本

    假设我有两个 UIView View1 边界 0 0 20 20 背景颜色 一些带有渐变或其他内容的复杂背景 View2 帧 0 0 20 20 背景颜色 蓝色 是 View1 的子视图并完全覆盖它 接下来 我想在 View2 上绘制一些文
  • 如何并行处理MSMQ消息

    我正在编写一个 Windows 服务来使用 MSMQ 消息 该服务将存在高活动期 80k 消息快速传入 和长时间不活动期 可能数天没有新消息 处理消息非常受网络限制 因此我从并行性中获得了很大的好处 但在不活动期间 我不想占用一堆线程来等待
  • REST API,具有从服务器到客户端的主动推送通知

    问题描述 我正在开发一个 Xamarin 应用程序 该应用程序使用用 Python Flask 编写的 REST API Xamarin 应用程序提供虚拟购物清单 用户可以在其中协作购买共享清单上的商品 为了改善用户体验 我希望能够主动通知
  • FolderClosedException:* BYE JavaMail 异常:java.io.IOException:连接被服务器删除?

    我正在使用 javamail 1 5 5 我想监听 GMail 邮箱中的新邮件 我有一个 MessageCountListener 的实现 在它的 messagesAdded 方法上 最后我这样做 try process new messa
  • 适用于 Android 的滑动切换

    任何人都知道 Android 的滑动切换的任何开源实现 默认的 android 切换 切换按钮 http developer android com reference android widget ToggleButton html 不漂
  • Shiro/Stormpath 通过 REST

    我是新来的士郎 我们正在尝试将 Shiro 与 Stormpath 一起使用 我一直在尝试剖析这些例子 以找出我想做的解决方案 但到目前为止我还没有成功 目前 我只是尝试创建 REST 服务来执行我想要的操作 稍后我将绑定一个真正的客户端
  • 在 fork() 中,哪个将首先运行,父进程还是子进程?

    当以下代码运行时 我知道父级和子级都会运行在平行下调用 fork 后立即执行 include
  • Angular Js 路由 Google Chrome 问题

    使用下面提到的 Code1 在 Angular Js 中进行基本路由并获得 XMLHttpRequest 无法加载跨源请求仅支持以下协议方案 http data chrome extension https chrome extension
  • 在logstash中使用grok解析多行JSON

    我有一个 JSON 格式 SOURCE Source A Model ModelABC Qty 3 我正在尝试使用 Logstash 解析此 JSON 基本上我希望logstash 输出是一个键 值对列表 我可以使用kibana 进行分析
  • Embarcadero WindowHandleToPlatform C++ 的示例

    我需要一个用于 C 构建器的 WindowHandleToPlatform 示例 我想使用句柄对表单执行 bitblt 和其他功能 我可以使用 VCL 来做到这一点并且效果很好 认为 WindowHandleToPlatform 是 fir
  • 为什么我的音频 AVCaptureConnection 对于最高分辨率格式不起作用?

    我正在开发一个 iOS 项目 该项目使用 AVAssetWriter 和 AVAssetWriterInput 将音频和视频录制到文件中 当视频分辨率限制为 720x1280 时 一切似乎都运行良好 我现在尝试利用 AVCaptureDev
  • 替换 Android 内核中的触摸屏驱动程序

    我正在为我的定制板调整姜饼内核 我正在尝试更换使用片上 ADC 控制器 三星的 S5PV210 处理器 的电阻式触摸屏 在我的设计中 我需要一个由 eGalaxyTouch 驱动程序支持的电容式控制器 它已连接至 USB 可以从 make
  • 帮助简化 WordPress 中的 if while 列表循环

    可以很好地理解上面的代码 1 我可以删除if和while条件吗 使用直接地 2 我感觉if have posts 与while have posts 是裁员吗 1 呼叫the post没有循环只会让您显示单个帖子 这在单帖子页面上可能是理想
  • 提高 8086 二进制 -> 格雷码的效率

    我是汇编初学者 这是我设计的代码 用于从二进制转换为灰度 并以十六进制打印生成的位模式 mov al a mov bl al shr bl 1 xor al bl 虽然程序可以运行 但我想了解其他更简单的方法来提高效率 我尝试了很多其他方法
  • NullPointerException 使用链表时出错

    我刚刚完成了这个程序的工作并编译了它 但它在用户输入后中断并给了我这个 请在键盘上输入0个或多个值 12 4 3 2 1 Exception in thread main java lang NullPointerException at
  • 实现与 URLSession 发布者和合并的重新连接

    我想知道是否有一种方法可以实现重连机制与新的Apple框架结合并使用URLSession发布者 试图在 WWDC 2019 中找到一些例子 尝试玩waitsForConnectivity运气不好 它甚至没有在自定义会话中调用委托 tried