Combine 如何在 try-catch 块中工作?

How does Combine work inside try-catch block?

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

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 发生在它之前 returns self.urlSession.dataTaskPublisher(for: request) or
  2. API 调用 apiCallOne 是否在后台执行并且 self.urlSession.dataTaskPublisher(for: request) 会立即被 returned?如果是这样,我可以在 apiCallOne 完成后 return 吗?

任何 pointers/help 都很好。

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

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

我预计,根据函数的名称,apiCallOne() 也会立即 returns 但开始在后台工作并在稍后的某个时间发出一个值。这两个 tryMaps 也会立即 return 但是当调用它们的 Publisher 发出值时发出值。

所有这些都对 apiCallOne() 的工作与 dataTaskPublisher(for:) 的工作同时进行产生了影响。