Swift 如何合并两个请求但返回通用发布服务器?详情如下

Swift 如何合并两个请求但返回通用发布服务器?详情如下,swift,generics,combine,publisher,Swift,Generics,Combine,Publisher,我有一个通用函数,用于向服务器发送请求。 现在,在发送请求之前,我需要检查会话令牌是否过期,并在需要时进行更新 我的函数如下所示 func上传(此处有一些参数)->AnyPublisher 我想在调用主请求之前检查并更新该函数中的令牌,但在这种情况下,我无法返回AnyPublisher 对于平面图: 无法将“publisher.FlatMap”类型的返回表达式转换为返回类型“AnyPublisher” 对于映射:无法将“publisher.map”类型的返回表达式转换为返回类型“AnyPubli

我有一个通用函数,用于向服务器发送请求。 现在,在发送请求之前,我需要检查会话令牌是否过期,并在需要时进行更新

我的函数如下所示
func上传(此处有一些参数)->AnyPublisher

我想在调用主请求之前检查并更新该函数中的令牌,但在这种情况下,我无法返回
AnyPublisher

对于平面图:
无法将“publisher.FlatMap”类型的返回表达式转换为返回类型“AnyPublisher”

对于映射:
无法将“publisher.map”类型的返回表达式转换为返回类型“AnyPublisher”

也许我需要换一种方法? 我在应用程序中有很多请求,所以在一个地方更新令牌是一个好主意,但是怎么做呢

以下是
refreshttoken()
函数

func refreshToken() -> AnyPublisher<Void, Error> {
        let request = ...
        let session = ...
        return session.dataTaskPublisher(for: request)
            .map(\.data)
            .decode(type: SomeTokenObject.self, decoder: JSONDecoder())
            .map {
                // saved new token
            }
            .eraseToAnyPublisher()
    }
func refreshttoken()->AnyPublisher{
让请求=。。。
让会话=。。。
返回会话。dataTaskPublisher(用于:请求)
.map(\.data)
.decode(类型:SomeTokenObject.self,解码器:JSONDecoder())
.地图{
//已保存的新令牌
}
.删除任何发布者()
}

你就快到了。您需要
eraseToAnyPublisher()
键入erase以删除返回的发布服务器

请记住,像
.flatMap
(或
.map
和其他操作符)这样的操作符返回自己的发布者,就像您在错误
发布者中看到的类型。flatMap
-您需要键入以下内容:

func upload<T: Decodable>(some parameters here) -> AnyPublisher<T, Error> {
    if shouldUpdateToken {
        return refreshToken() // returns AnyPublisher<Void, Error>
            .flatMap { _ -> AnyPublisher<T, Error> in
                upload()
            }
            .eraseToAnyPublisher() // <- type-erase here
            
    } else {
        return upload() // actually "return"
    }
}
func上传(此处有一些参数)->AnyPublisher{
如果应该更新的话{
return refreshttoken()//返回AnyPublisher
.flatMap{{->AnyPublisher位于
上传()
}

.eraseToAnyPublisher()//在条件内对返回的发布服务器使用
.eraseToAnyPublisher()
。您还需要将
.flatMap
发送给实际返回
T
value@NewDev我试过了,但得到了同样的结果。顺便说一句,它在
refreshttoken()中使用
当然可以,但是你用
.flatMap
对它进行了扩充,它返回一个不同的类型。你需要将它添加到链的末尾:
refreshToken().flatMap{..}.橡皮擦AnyPublisher()
真的,谢谢!我试过了,但可能还有另一个问题。我马上接受你的答案:)现在太早了。
func refreshToken() -> AnyPublisher<Void, Error> {
        let request = ...
        let session = ...
        return session.dataTaskPublisher(for: request)
            .map(\.data)
            .decode(type: SomeTokenObject.self, decoder: JSONDecoder())
            .map {
                // saved new token
            }
            .eraseToAnyPublisher()
    }
func upload<T: Decodable>(some parameters here) -> AnyPublisher<T, Error> {
    if shouldUpdateToken {
        return refreshToken() // returns AnyPublisher<Void, Error>
            .flatMap { _ -> AnyPublisher<T, Error> in
                upload()
            }
            .eraseToAnyPublisher() // <- type-erase here
            
    } else {
        return upload() // actually "return"
    }
}