Как использовать библиотеку KingFisher или AlamofireImage с токеном авторизации?

У меня есть tableView с customCells, и мне нужно загрузить изображения из REST API (доступ с токеном авторизации). Поскольку я новичок в Swift, я наткнулся на несколько библиотек, и кажется, что KingFisher или AlamofireImage хороши для асинхронной загрузки и кэширования изображений, полученных из вызова API.

Но поскольку у моего API здесь есть токен доступа, как он может быть передан в этот запрос?

//image handling with kingfisher
    if let imgView = cell.schoolCoverImage {
        imgView.kf_setImageWithURL(
            NSURL(string: "")!,
            placeholderImage: nil,
            optionsInfo: nil,
            progressBlock: nil,
            completionHandler: { (image, error, CacheType, imageURL) -> () in
                self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) }
        )
    }

Например, в Alamofire есть заголовки полей, в которые можно передать токен доступа.

 //Sample API call with Alamofire
  Alamofire.request(
        .GET,
        baseURL+schools+nonAcademicParameter,
        headers: accessToken
        )
        .responseJSON { response in
            switch response.result {
            case .Success(let value):
                completionHandler(value, nil)
            case .Failure(let error):
                completionHandler(nil, error)
            }
    }

Но с AlamofireImage заголовки полей кажутся недоступными.

//Image request with AlamofireImage
 Alamofire.request(
        .GET,
        "https://httpbin.org/image/png"),
    headers: ["Authorization" : "Bearer fbzi5u0f5kyajdcxrlnhl3zwl1t2wqaor"]  //not available
        .responseImage { response in
            debugPrint(response)

            print(response.request)
            print(response.response)
            debugPrint(response.result)

            if let image = response.result.value {
                print("image downloaded: \(image)")
            }
    }

person Stefan Badertscher    schedule 19.07.2016    source источник
comment
Централизованный и надежный способ передачи пользовательских заголовков ко всем запросам изображений. Обратитесь к этому ответу stackoverflow.com/a/50929243/6630644   -  person SPatel    schedule 19.06.2018


Ответы (2)


Вы можете просто использовать модификатор запроса и передать его как опцию методу настройки изображения Kingfisher. Как это:

let modifier = AnyModifier { request in
    var r = request
    r.setValue("Bearer fbzi5u0f5kyajdcxrlnhl3zwl1t2wqaor", forHTTPHeaderField: "Authorization")
    return r
}       
imageView.kf.setImage(with: url, placeholder: nil, options: [.requestModifier(modifier)])

См. вики-страницу Kingfisher для более.

person onevcat    schedule 18.10.2016

Я понял это в конце концов

создайте следующее в viewdidload()

//create custom session with auth header
        let sessionConfig =   
NSURLSessionConfiguration.defaultSessionConfiguration()
        let xHTTPAdditionalHeaders: [String : String] = 
self.restApi.accessToken
        sessionConfig.HTTPAdditionalHeaders = xHTTPAdditionalHeaders

         self.imageDownloader = ImageDownloader(
            configuration: sessionConfig,
            downloadPrioritization: .FIFO,
            maximumActiveDownloads: 4,
            imageCache: AutoPurgingImageCache()
        )

используйте его в ячейке forrowatindexpath:

let URLRequest = NSURLRequest(URL: NSURL(string: "https:/xxx.com/olweb/api/v1/schools/"+schoolIdString+"/image/"+ImageNameString)!)

    self.imageDownloader.downloadImage(URLRequest: URLRequest) { response in
        print(response.request)
        print(response.response)
        debugPrint(response.result)

        if let image = response.result.value {
            print("here comes the printed image:: ")
            print(image)
            print(schoolIdString)
            cell.schoolCoverImage.image = image
            cell.schoolBiggerImage.image = image
        } else {
            print("image not downloaded")
        }
    }
person Stefan Badertscher    schedule 20.07.2016
comment
Пожалуйста, никогда не запускайте какой-либо сетевой код или что-либо, что требует времени в cellForRowAtIndexPath. - person Tobias Timpe; 10.09.2020