如何通过 API URL 显示图像? Swift
How can I display an image by an API URL? Swift
我有一个应用程序,它向我显示来自 API 的数据。我做了一个获取数据的服务,其中 URL(string = "") 是 API:
的 url
class Webservice {
func getAllMatches(completion: @escaping ([Matches.Matchs]?) -> ()) {
guard let url = URL(string: "API")
else {
fatalError("URL is not correct!")
}
URLSession.shared.dataTask(with: url) { data, _, _ in
let matchs = try! JSONDecoder().decode([Matches.Matchs].self, from: data!)
DispatchQueue.main.async {
completion(matchs)
}
}.resume()
}
}
然后我制作了一个 ViewModel,其中设置了 API 字段:
class MatchListViewModel: ObservableObject {
@Published var matches = [MatchViewModel]()
init() {
fetchMatch()
}
func fetchMatch() {
Webservice().getAllMatches { matches in
if let matches = matches {
self.matches = matches.map(MatchViewModel.init)
}
}
}
}
class MatchViewModel {
let id = UUID()
var match: Matches.Matchs
init(match: (Matches.Matchs)) {
self.match = match
}
var championship: String {
return self.match.championship.name
}
var local_Name: String {
return self.match.local.name
}
var local_Image: String {
return self.match.local.image
}
var local_goals: Double {
return self.match.local_goals
}
var local_penalty_goals: Double {
return self.match.local_penalty_goals
}
var stadium_Name: String {
return self.match.stadium.name
}
}
在API中有一个显示图片的字段,包含在URL中,我举个例子:
"local":{
"slug":"nombre",
"name":"nombre",
"short_name":"nombre",
"image":"https://s3.amazonaws.com/funx-futbol/dashboard/ad.png"
},
我的问题是:如何通过 URL 显示该图像? API 查询有效,因为它给我带来了我需要的信息,但我需要通过 link 向我展示图像,但我还没有实现。
感谢阅读!
error
您可以通过 init?(contentsOf:) 初始化数据:https://developer.apple.com/documentation/foundation/data/3126626-init and then you can use that data to initialize UIImage via init?(data:): https://developer.apple.com/documentation/uikit/uiimage/1624106-init
如果您选择这种方式,请记住默认情况下此数据初始化程序不会 运行 在后台线程上,因此您的性能可能会很差,您可能想将其推送到后台,然后再打开完成使用 GCD 使用结果并更新 UI.
使用这样的加载器加载数据:
import Combine
public class DataLoader: ObservableObject {
public let objectWillChange = PassthroughSubject<Data,Never>()
public private(set) var data = Data() {
willSet {
objectWillChange.send(newValue)
}
}
private let resourseURL: URL?
public init(resourseURL: URL?){
self.resourseURL = resourseURL
}
public func loadImage() {
guard let url = resourseURL else {
return
}
URLSession.shared.dataTask(with: url) { (data,_,_) in
guard let data = data else {
return
}
DispatchQueue.main.async {
self.data = data
}
} .resume()
}
}
用这样的结构来显示它:
import SwiftUI
struct WebImage: View {
@ObservedObject private var imageLoader: DataLoader
public init(imageURL: URL?) {
imageLoader = DataLoader(resourseURL: imageURL)
}
public var body: some View {
if let uiImage = UIImage(data: self.imageLoader.data) {
return AnyView(Image(uiImage: uiImage)
.resizable()
.aspectRatio(contentMode: ContentMode.fit))
} else {
return AnyView(Image(systemName: "ellipsis")
.onAppear(perform: { self.imageLoader.loadImage() }))
}
}
}
如果您不想编写任何自定义 类,可以使用 URLImage 库。它具有大量可应用于远程图像的自定义选项。
您可以通过添加 swift 包 (steps) 将其安装到您的项目中。
希望对您有所帮助。
编码愉快。
我有一个应用程序,它向我显示来自 API 的数据。我做了一个获取数据的服务,其中 URL(string = "") 是 API:
的 urlclass Webservice {
func getAllMatches(completion: @escaping ([Matches.Matchs]?) -> ()) {
guard let url = URL(string: "API")
else {
fatalError("URL is not correct!")
}
URLSession.shared.dataTask(with: url) { data, _, _ in
let matchs = try! JSONDecoder().decode([Matches.Matchs].self, from: data!)
DispatchQueue.main.async {
completion(matchs)
}
}.resume()
}
}
然后我制作了一个 ViewModel,其中设置了 API 字段:
class MatchListViewModel: ObservableObject {
@Published var matches = [MatchViewModel]()
init() {
fetchMatch()
}
func fetchMatch() {
Webservice().getAllMatches { matches in
if let matches = matches {
self.matches = matches.map(MatchViewModel.init)
}
}
}
}
class MatchViewModel {
let id = UUID()
var match: Matches.Matchs
init(match: (Matches.Matchs)) {
self.match = match
}
var championship: String {
return self.match.championship.name
}
var local_Name: String {
return self.match.local.name
}
var local_Image: String {
return self.match.local.image
}
var local_goals: Double {
return self.match.local_goals
}
var local_penalty_goals: Double {
return self.match.local_penalty_goals
}
var stadium_Name: String {
return self.match.stadium.name
}
}
在API中有一个显示图片的字段,包含在URL中,我举个例子:
"local":{
"slug":"nombre",
"name":"nombre",
"short_name":"nombre",
"image":"https://s3.amazonaws.com/funx-futbol/dashboard/ad.png"
},
我的问题是:如何通过 URL 显示该图像? API 查询有效,因为它给我带来了我需要的信息,但我需要通过 link 向我展示图像,但我还没有实现。
感谢阅读!
error
您可以通过 init?(contentsOf:) 初始化数据:https://developer.apple.com/documentation/foundation/data/3126626-init and then you can use that data to initialize UIImage via init?(data:): https://developer.apple.com/documentation/uikit/uiimage/1624106-init
如果您选择这种方式,请记住默认情况下此数据初始化程序不会 运行 在后台线程上,因此您的性能可能会很差,您可能想将其推送到后台,然后再打开完成使用 GCD 使用结果并更新 UI.
使用这样的加载器加载数据:
import Combine
public class DataLoader: ObservableObject {
public let objectWillChange = PassthroughSubject<Data,Never>()
public private(set) var data = Data() {
willSet {
objectWillChange.send(newValue)
}
}
private let resourseURL: URL?
public init(resourseURL: URL?){
self.resourseURL = resourseURL
}
public func loadImage() {
guard let url = resourseURL else {
return
}
URLSession.shared.dataTask(with: url) { (data,_,_) in
guard let data = data else {
return
}
DispatchQueue.main.async {
self.data = data
}
} .resume()
}
}
用这样的结构来显示它:
import SwiftUI
struct WebImage: View {
@ObservedObject private var imageLoader: DataLoader
public init(imageURL: URL?) {
imageLoader = DataLoader(resourseURL: imageURL)
}
public var body: some View {
if let uiImage = UIImage(data: self.imageLoader.data) {
return AnyView(Image(uiImage: uiImage)
.resizable()
.aspectRatio(contentMode: ContentMode.fit))
} else {
return AnyView(Image(systemName: "ellipsis")
.onAppear(perform: { self.imageLoader.loadImage() }))
}
}
}
如果您不想编写任何自定义 类,可以使用 URLImage 库。它具有大量可应用于远程图像的自定义选项。
您可以通过添加 swift 包 (steps) 将其安装到您的项目中。
希望对您有所帮助。
编码愉快。