【问题标题】:How does Combine work inside try-catch block?Combine 如何在 try-catch 块中工作?
【发布时间】:2021-02-17 12:23:32
【问题描述】:

我正在尝试使用 combine 制作一个 try-catch 块,以便我可以执行某些函数并再次重新执行 main 块。我正在做这样的事情-

return urlSession.dataTaskPublisher(for: request)
    .tryMap(verifyAPIResponse)
    .tryCatch { (error) -> AnyPublisher<(data: Data, response: URLResponse), URLError> in
        self.apiCallOne()
            .tryMap(\.apiResponse)
            .tryMap({ (response) in
            })
        return self.urlSession.dataTaskPublisher(for: request) //<<- DOES this execute after refreshToken or executes in parallel?
    }
    .tryMap(parseJson)
    .receive(on: RunLoop.main)
    .eraseToAnyPublisher()

所以我主要关心的是 -

  1. apiCallOne 是否在返回 self.urlSession.dataTaskPublisher(for: request) 或之前发生
  2. API 调用 apiCallOne 是否在后台执行并立即返回 self.urlSession.dataTaskPublisher(for: request)?如果是这样,我可以在 apiCallOne 完成后返回吗?

任何指针/帮助都会很棒。

【问题讨论】:

    标签: ios swift combine


    【解决方案1】:

    tryCatch 闭包中的函数按顺序执行,就像任何普通代码一样。首先apiCallOne() 执行,然后当它返回时tryMap(\.apiResponse) 执行然后tryMap({ response in }) 执行然后dataTaskPublisher(for:) 执行并返回它的值。

    请记住,dataTaskPublisher(for:) 会立即返回其发布者,但会开始在后台工作。该作品稍后会通过 Publisher 发出一个值。

    我希望,根据函数的名称,apiCallOne() 也会立即返回,但会在后台开始工作并在稍后发出一个值。两个 tryMap 也立即返回,但在调用它们的 Publisher 发出值时发出值。

    所有这些都具有apiCallOne()s 工作与dataTaskPublisher(for:)s 工作同时发生的效果。

    【讨论】:

    • 谢谢。在你的帮助下,我能够走到最后。是的,它确实像你说的那样同步执行。
    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多