Alamofire 소스 URLConvertible

3061 단어
Alamofire에서 네트워크 요청을 수행하는 방법은 다음과 같습니다.
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은 책의 일급 속성이 아니라 그 내부에 끼워 넣은 다른 대상의 그룹/사전에서 얻은 것이다. 우리가 사용할 때 많은 해석을 줄일 수 있지 않을까

좋은 웹페이지 즐겨찾기