Swift 联合收割机can'的结果;我得不到结果
我写的一切都是正确的,代码本身也在工作,但是它给了我一个错误的结果,调用'fetchPokemon()'是未使用的,这里会有什么问题 Hear是我的代码:ModelView类Swift 联合收割机can'的结果;我得不到结果,swift,xcode,swiftui,combine,Swift,Xcode,Swiftui,Combine,我写的一切都是正确的,代码本身也在工作,但是它给了我一个错误的结果,调用'fetchPokemon()'是未使用的,这里会有什么问题 Hear是我的代码:ModelView类 import Foundation import Combine class NetworkManager: ObservableObject { let baseuRL = "https://pokeapi.co/api/v2/pokemon" @Published var pokemon:
import Foundation
import Combine
class NetworkManager: ObservableObject {
let baseuRL = "https://pokeapi.co/api/v2/pokemon"
@Published var pokemon: [Pokemon] = []
var error: Error?
var cancellables: Set<AnyCancellable> = []
func fetchPokemon() -> Future<[Pokemon], Error> {
return Future<[Pokemon], Error> { promice in
guard let url = URL(string: "\(self.baseuRL)") else {
return promice(.failure(ApiError.unknowed))
}
URLSession.shared.dataTaskPublisher(for: url)
.tryMap { (data, response) -> Data in
guard let http = response as? HTTPURLResponse,
http.statusCode == 200 else {
throw ApiError.responseError
}
return data
}
.decode(type: PokemonList.self, decoder: JSONDecoder())
.receive(on: RunLoop.main)
.sink(receiveCompletion: { completion in
switch completion {
case .finished:
break
case .failure(let error):
print(error)
}
}, receiveValue: {
promice(.success($0.results))
})
.store(in: &self.cancellables)
}
}
struct ContentView: View {
@StateObject var net = NetworkManager()
var body: some View {
List(net.pokemon, id: \.self) { pokemon in
Text(pokemon.name)
}.onAppear {
net.fetchPokemon()
}
}
<代码>导入基础
进口联合收割机
类网络管理器:ObserveObject{
让baseuRL=”https://pokeapi.co/api/v2/pokemon"
@发布变量口袋妖怪:[口袋妖怪]=[]
var错误:错误?
变量可取消项:Set=[]
func fetchPokemon()->Future{
返回未来{promice in
guard let url=url(字符串:“\(self.baseuRL)”)else{
返回承诺(.failure(ApiError.未知))
}
URLSession.shared.dataTaskPublisher(用于:url)
.tryMap{(数据,响应)->中的数据
guard let http=响应为?HTTPURLResponse,
http.statusCode==200其他{
抛出ApiError.responseError
}
返回数据
}
.decode(类型:PokemonList.self,解码器:JSONDecoder())
.receive(打开:RunLoop.main)
.sink(receiveCompletion:{completion in
交换完成{
案例。完成:
打破
案例。失败(let错误):
打印(错误)
}
},接收值:{
promice(.success($0.results))
})
.store(in:&self.cancelables)
}
}
结构ContentView:View{
@StateObject var net=NetworkManager()
var body:一些观点{
列表(net.pokemon,id:\.self){pokemon在
文本(pokemon.name)
}奥纳佩尔先生{
net.fetchPokemon()
}
}
}你的
fetchPokemon
函数返回一个未来
,但你没有对它做任何事情——这就是为什么你会得到未使用的错误
此外,在该函数中,您将返回您的承诺,但不会对结果执行任何操作。因此,您需要处理未来
,并对这些结果执行一些操作
它可能看起来如下所示:
class NetworkManager: ObservableObject {
let baseuRL = "https://pokeapi.co/api/v2/pokemon"
@Published var pokemon: [Pokemon] = []
var error: Error?
var cancellables: Set<AnyCancellable> = []
//New function here:
func runFetch() {
fetchPokemon().sink { (completion) in
//handle completion, error
} receiveValue: { (pokemon) in
self.pokemon = pokemon //do something with the results from your promise
}.store(in: &cancellables)
}
private func fetchPokemon() -> Future<[Pokemon], Error> {
return Future<[Pokemon], Error> { promice in
guard let url = URL(string: "\(self.baseuRL)") else {
return promice(.failure(ApiError.unknowed))
}
URLSession.shared.dataTaskPublisher(for: url)
.tryMap { (data, response) -> Data in
guard let http = response as? HTTPURLResponse,
http.statusCode == 200 else {
throw ApiError.responseError
}
return data
}
.decode(type: PokemonList.self, decoder: JSONDecoder())
.receive(on: RunLoop.main)
.sink(receiveCompletion: { completion in
switch completion {
case .finished:
break
case .failure(let error):
print(error)
}
}, receiveValue: {
promice(.success($0.results))
})
.store(in: &self.cancellables)
}
}
}
struct ContentView: View {
@StateObject var net = NetworkManager()
var body: some View {
List(net.pokemon, id: \.self) { pokemon in
Text(pokemon.name)
}.onAppear {
net.runFetch() //call runFetch instead of fetchPokemon
}
}
}
如果类型不同,则必须在
runFetch
中更改receiveValue
中发生的情况。您的fetchPokemon
函数返回一个Future
,但您没有对其执行任何操作,这就是为什么会出现未使用的错误
此外,在该函数中,您将返回您的承诺,但不会对结果执行任何操作。因此,您需要处理未来
,并对这些结果执行一些操作
它可能看起来如下所示:
class NetworkManager: ObservableObject {
let baseuRL = "https://pokeapi.co/api/v2/pokemon"
@Published var pokemon: [Pokemon] = []
var error: Error?
var cancellables: Set<AnyCancellable> = []
//New function here:
func runFetch() {
fetchPokemon().sink { (completion) in
//handle completion, error
} receiveValue: { (pokemon) in
self.pokemon = pokemon //do something with the results from your promise
}.store(in: &cancellables)
}
private func fetchPokemon() -> Future<[Pokemon], Error> {
return Future<[Pokemon], Error> { promice in
guard let url = URL(string: "\(self.baseuRL)") else {
return promice(.failure(ApiError.unknowed))
}
URLSession.shared.dataTaskPublisher(for: url)
.tryMap { (data, response) -> Data in
guard let http = response as? HTTPURLResponse,
http.statusCode == 200 else {
throw ApiError.responseError
}
return data
}
.decode(type: PokemonList.self, decoder: JSONDecoder())
.receive(on: RunLoop.main)
.sink(receiveCompletion: { completion in
switch completion {
case .finished:
break
case .failure(let error):
print(error)
}
}, receiveValue: {
promice(.success($0.results))
})
.store(in: &self.cancellables)
}
}
}
struct ContentView: View {
@StateObject var net = NetworkManager()
var body: some View {
List(net.pokemon, id: \.self) { pokemon in
Text(pokemon.name)
}.onAppear {
net.runFetch() //call runFetch instead of fetchPokemon
}
}
}
如果类型不同,您必须在
runFetch
中更改receiveValue
中发生的情况。谢谢,一切正常,但我不明白为什么不可能在一个函数中完成此操作,结果是您需要在一个函数中创建会话,并在第二个函数中签署签名您可以在一个函数中完成所有操作如果你想要返回未来,你可以将水槽和存储区连接到你原来拥有的东西的末端。虽然看起来有点凌乱。谢谢,一切正常,但我一点也不明白为什么不可能在一个函数中完成这项工作,结果是你需要在一个函数中完成一个会话,然后在第二个函数中签署一个签名。你可以全部完成第一种。你可以把水槽和储物罐连接到你原来拥有的东西的末端,而不是归还未来。不过,这看起来有点凌乱。