Alamofire 소스 URLConvertible
func request(
_ url: URLConvertible,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
encoding: ParameterEncoding = URLEncoding.default,
headers: HTTPHeaders? = nil)
-> DataRequest
그 중에서 요청한 URL은 우리가 익숙한 URL이나 String이 아니라 URLConvertible 형식입니다.URLConvertible는 하나의 프로토콜로 오직 하나의 방법만이 실현되어야 한다
func asURL() throws -> URL
이 방법은 오류를 던질 수 있는 URL 대상을 되돌려주고 간접적으로 네트워크 요청에 URL을 제공합니다.Alamofire에는 기본적으로 String, URL, URLComponents가 있습니다. 이 프로토콜을 준수하고 실현하면 요청 네트워크에서 편리하게 사용할 수 있습니다.
우리는 두 가지 코드를 포기할 수 있다. 1.string 형식을 직접 사용하고 요청할 때마다 URL로 전환합니다. 이런 방식을 사용하면 전체 앱에 대량의 중복 코드가 발생합니다
guard let url = URL(string: "") else { return }
xxxxxxxxxx
2. 또는 직접 String/URLComponents에 extension을 작성하여 해당하는 URL을 되돌려줍니다.
extension String {
func asurl() -> URL? {}
}
extension URLComponents {
func asurl() -> URL? {}
}
이런 방식은 첫 번째 방식보다 좀 편하지만 여전히 간결하지 않다. - 그들 사이에는 공통성이 없고 모범적이지 않기 때문에 우리는 두 가지 기본적으로 같은 방법을 쓸 가능성이 높다. 변수 유형만 변할 수 있다.
func request(url: String) {
guard let url = url.asurl() else { return }
xxxx
}
func request(url: URLComponents) {
guard let url = url.asurl() else { return }
xxxx
}
--------------------------나는 분할선----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
func setImage(with resource: Resource?,
placeholder: Placeholder? = nil,
options: KingfisherOptionsInfo? = nil,
progressBlock: DownloadProgressBlock? = nil,
completionHandler: CompletionHandler? = nil) -> RetrieveImageTask
이것은 Resource 프로토콜입니다. 두 변수만 제공하면 됩니다.
public protocol Resource {
var cacheKey: String { get }
var downloadURL: URL { get }
}
Kingfisher는 기본적으로 URL의 Resource 프로토콜만 제공하기 때문에 URL 대상으로 그림을 요청할 수 있습니다.
만약에 저희가 책 구조체가 있다면...
struct Book {
let name: String
let pic: String
}
만약 책을 전시하는 책의 표지가 필요하다면, 우리는 이렇게 사용할 수 있다
func setPic(from book: Book) {
let imgv = UIImageView()
imgv.kf.setImage(with: URL(string: book.pic))
}
마법에 주의하세요. 만약에 Book도 Resource 프로토콜을 준수하고 실현한다면 우리는 코드를 더욱 간결하게 쓸 수 있습니다
extension Book: Resource {
var downloadURL: URL {
return URL(string: pic)!
}
var cacheKey: String {
return name
}
}
그리고 우리는 이렇게 쓸 수 있다. 그렇지?
func setPic(from book: Book) {
let imgv = UIImageView()
imgv.kf.setImage(with: book)
}
책 구조체가 너무 간단해서 두 가지 방법이 다 될 것 같아서 큰 차이가 없다.우리는 다음과 같은 장면을 생각해 보자. 표지 URL은 책의 일급 속성이 아니라 그 내부에 끼워 넣은 다른 대상의 그룹/사전에서 얻은 것이다. 우리가 사용할 때 많은 해석을 줄일 수 있지 않을까
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.