我会try 使用MVVM获取Pokemon的一个API的数据,我使用我的MainViewModel执行请求,如果我在MainViewModel中打印Pokemon数组,我会得到数组,但当我将数组发送给代表时,我无法在MainViewDelegate中显示该array. 向你问好.
当我在MainViewModel中打印数据时,得到的数据如下所示.
[Pokemon.PokemonModel(name: "bulbasaur", imageURL: "https://pokeapi.co/api/v2/pokemon/1/"), Pokemon.PokemonModel(name: "ivysaur", imageURL: "https://pokeapi.co/api/v2/pokemon/2/"), Pokemon.PokemonModel(name: "venusaur", imageURL: "https://pokeapi.co/api/v2/pokemon/3/")]
// MainViewController.swift
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemGray6
setUpView()
setUpLayout()
viewModel.fetchPokemon()
}
// MainViewModel.swift
import UIKit
class MainViewModel {
let pokemonUrl = "https://pokeapi.co/api/v2/pokemon?limit=898&offset=0"
var delegate: MainViewDelegate?
func getPokemonImage() -> UIImage {
return UIImage(named: "pikachu")!
}
func getTitleButton() -> String {
return "Pokemon"
}
func fetchPokemon() {
performRequest(with: pokemonUrl)
}
private func performRequest(with urlString: String) {
// 1. Create/get URL
if let url = URL(string: urlString) {
// 2. Create URLSession
let session = URLSession(configuration: .default)
// 3. Give the session a task
let task = session.dataTask(with: url) { [self] data, response, error in
if error != nil {
delegate?.didFailWithError(error: error!)
}
if let safeData = data {
if let pokemon = self.parseJSON(pokemonData: safeData) {
delegate?.didUpdatePokemon(pokemons: pokemon)
print(pokemon)
}
}
}
// 4. Start the task
task.resume()
}
}
private func parseJSON(pokemonData: Data) -> [PokemonModel]? {
let decoder = JSONDecoder()
do {
let decodeData = try decoder.decode(PokemonData.self, from: pokemonData)
let pokemon = decodeData.results?.compactMap({
if let name = $0.name, let imageURL = $0.url {
return PokemonModel(name: name, imageURL: imageURL)
}
return nil
})
return pokemon
} catch {
return nil
}
}
}
// MainView+Delegates.swift
import UIKit
// MARK: - Custom Delegates
extension MainViewController: MainViewDelegate {
func didFailWithError(error: Error) {
print(error)
}
func didUpdatePokemon(pokemons: [PokemonModel]) {
print(pokemons)
}
}
extension Collection where Indices.Iterator.Element == Index {
public subscript(safe index: Index) -> Iterator.Element? {
return (startIndex <= index && index < endIndex) ? self[index] : nil
}
}
// Get 4 items
extension Collection {
func choose(_ n: Int) -> Array<Element> {
Array(shuffled().prefix(n))
}
}
//
// MainView+Protocols.swift
//
import Foundation
// MARK: - Que es lo que debe de tener
protocol MainViewDelegate {
func didUpdatePokemon(pokemons: [PokemonModel])
func didFailWithError(error: Error)
}
//
// PokemonData.swift
import UIKit
// MARK: - PokemonData
struct PokemonData: Codable {
let results: [Result]?
}
struct Result: Codable {
let name: String?
let url: String?
}
//
// PokemonModel.swift
import Foundation
struct PokemonModel {
let name: String
let imageURL: String
}
我try 使用委托来使用数据.