如何在 swift 4 中解析部分 link?
How to parse partial link in swift 4?
我正在尝试将来自 API 的图像显示到我的 table 单元格视图中。但它在那里给出了部分 link,结果,我收到 NSURL 连接错误代码 -1002.
这是我的APIlink:https://api.opendota.com/api/heroStats
我正在尝试解析其中的“图标”:
"img": "/apps/dota2/images/heroes/antimage_full.png?",
"图标": "/apps/dota2/images/heroes/antimage_icon.png",
我的代码:
// 生成图像视图
if let imageURL = URL(string: heroes[indexPath.row].icon){
print (imageURL)
DispatchQueue.global().async {
let data = try? Data (contentsOf: imageURL)
if let data = data {
let image = UIImage(data: data)
DispatchQueue.main.async {
cell.charIcon.image = image
} //end of 2nd dispatch
}//end of if
}//end of 1st dispatch
}// end of imageURL
我该如何解决这个问题? swift 4 有什么简单的方法吗?
您可以获得 api link 的 url 组件并使用您的图标“部分 link” 设置路径 属性 URL 个组件。之后,您只需要获得 url 组件的结果 url:
let apiLink = "https://api.opendota.com/api/heroStats"
let apiURL = URL(string: apiLink)!
if var urlComponents = URLComponents(url: apiURL, resolvingAgainstBaseURL: false) {
let iconString = "/apps/dota2/images/heroes/antimage_icon.png"
urlComponents.path = iconString
if let iconURL = urlComponents.url {
print(iconURL.absoluteString)
}
}
这将打印
https://api.opendota.com/apps/dota2/images/heroes/antimage_icon.png
您可以根据新的路径字符串创建自定义方法 return 新的 URL,如下所示:
extension URL {
var urlComponents: URLComponents? {
return URLComponents(url: self, resolvingAgainstBaseURL: false)
}
func bySettingNew(path: String) -> URL? {
guard var urlComponents = urlComponents else { return nil }
urlComponents.path = path
return urlComponents.url
}
}
let apiLink = "https://api.opendota.com/api/heroStats"
let apiURL = URL(string: apiLink)!
let iconString = "/apps/dota2/images/heroes/antimage_icon.png"
if let iconURL = apiURL.bySettingNew(path: iconString) {
print(iconURL.absoluteString)
}
您还可以将此助手添加到您的项目中,以便更轻松地将图像异步下载到您的图像视图中:
extension UIImageView {
func downloaded(from url: URL, contentMode mode: UIView.ContentMode = .scaleAspectFit) {
URLSession.shared.dataTask(with: url) { data, response, error in
guard
let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
let data = data, error == nil,
let image = UIImage(data: data)
else { return }
DispatchQueue.main.async() { [weak self] in
self?.contentMode = mode
self?.image = image
}
}.resume()
}
}
if let imageURL = apiURL.bySettingNew(path: heroes[indexPath.row].icon) {
cell.charIcon.downloaded(from: imageURL)
}
我正在尝试将来自 API 的图像显示到我的 table 单元格视图中。但它在那里给出了部分 link,结果,我收到 NSURL 连接错误代码 -1002.
这是我的APIlink:https://api.opendota.com/api/heroStats
我正在尝试解析其中的“图标”: "img": "/apps/dota2/images/heroes/antimage_full.png?", "图标": "/apps/dota2/images/heroes/antimage_icon.png",
我的代码: // 生成图像视图
if let imageURL = URL(string: heroes[indexPath.row].icon){
print (imageURL)
DispatchQueue.global().async {
let data = try? Data (contentsOf: imageURL)
if let data = data {
let image = UIImage(data: data)
DispatchQueue.main.async {
cell.charIcon.image = image
} //end of 2nd dispatch
}//end of if
}//end of 1st dispatch
}// end of imageURL
我该如何解决这个问题? swift 4 有什么简单的方法吗?
您可以获得 api link 的 url 组件并使用您的图标“部分 link” 设置路径 属性 URL 个组件。之后,您只需要获得 url 组件的结果 url:
let apiLink = "https://api.opendota.com/api/heroStats"
let apiURL = URL(string: apiLink)!
if var urlComponents = URLComponents(url: apiURL, resolvingAgainstBaseURL: false) {
let iconString = "/apps/dota2/images/heroes/antimage_icon.png"
urlComponents.path = iconString
if let iconURL = urlComponents.url {
print(iconURL.absoluteString)
}
}
这将打印
https://api.opendota.com/apps/dota2/images/heroes/antimage_icon.png
您可以根据新的路径字符串创建自定义方法 return 新的 URL,如下所示:
extension URL {
var urlComponents: URLComponents? {
return URLComponents(url: self, resolvingAgainstBaseURL: false)
}
func bySettingNew(path: String) -> URL? {
guard var urlComponents = urlComponents else { return nil }
urlComponents.path = path
return urlComponents.url
}
}
let apiLink = "https://api.opendota.com/api/heroStats"
let apiURL = URL(string: apiLink)!
let iconString = "/apps/dota2/images/heroes/antimage_icon.png"
if let iconURL = apiURL.bySettingNew(path: iconString) {
print(iconURL.absoluteString)
}
您还可以将此助手添加到您的项目中,以便更轻松地将图像异步下载到您的图像视图中:
extension UIImageView {
func downloaded(from url: URL, contentMode mode: UIView.ContentMode = .scaleAspectFit) {
URLSession.shared.dataTask(with: url) { data, response, error in
guard
let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
let data = data, error == nil,
let image = UIImage(data: data)
else { return }
DispatchQueue.main.async() { [weak self] in
self?.contentMode = mode
self?.image = image
}
}.resume()
}
}
if let imageURL = apiURL.bySettingNew(path: heroes[indexPath.row].icon) {
cell.charIcon.downloaded(from: imageURL)
}